Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Срочно, прошу помощи (макросы в lisp), нужно срочно, в долгу не останусь 
:(
    Опции темы
macrox
  Дата 10.6.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



Ребята, срочно нужна помощь. Задание:
Сформировать макрос новой формы (МАТРИЦА (список1)(список2)...(списокN)) собрать все списки в один такой : 
((голова1...головаN) (второйэлемент1...второйэлементN)... (Nэлемент1...NэлементN))
Макрос должен быть как можно меньше по байтам. Среда - mulisp.
Отблагодарю чем смогу, проблема только в сроках - завтра - макс. послезавтра нужно сдать.
PM MAIL   Вверх
VH_
Дата 11.6.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Вы уточните, пожалуйста, действительно ли Вам необходим именно macro - дело в том, что эта задача весьма элегантно решается посредством function:
Код
(funcall 'mapcar 'list список1 список2... списокN)

Код
(defun MATRIX (список1 список2... списокN)
 (funcall 'mapcar 'list список1 список2... списокN))

PM MAIL   Вверх
macrox
Дата 11.6.2009, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



Да, мне нужен именно макрос, при чем я лично дошел до того что он должен быть рекурсивным -  обход по первым элементам списков, урезание главного списка (избавление от этих всех элементов) и так далее пока список не пуст. Но реализовать мне это не удается :(Я полагаю что решением задачи должен быть макрос, с вызовом, к примеру таким:
(МАТРИЦА (1 2 3) (4 5 6) (7 8 9)) и вернет мне ( (1 4 7) (2 5 8) (3 6 9)) либо же (МАТРИЦА ((1 2 3) (4 5 6) (7 8 9))), возврат такой же. Ваш код при таких вызовах не работает, или я что-то не понял, напишите пожалуйста пример.
Спасибо что помогаете.
PM MAIL   Вверх
kosmonaFFFt
Дата 11.6.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Код, написанный выше принимает списки, а ты передаешь список списков, вот он и не работает...


--------------------
user posted image
PM MAIL ICQ   Вверх
macrox
Дата 11.6.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



Код

(defun MATRIX (список1 список2... списокN)
 (funcall 'mapcar 'list список1 список2... списокN))


Если передавать в качестве параметров 3 списка '(1 2 3) '(4 5 6) '(7 8 9) то все работает, если больше или меньше - нет. как я понимаю список1 список2... списокN воспринимаются просто как 3 списка, а нужно чтоб работало любое количество списков:( 
Переделать эту ф-цию под макрос  реально? Я знаю что макрос отличается от ф-ции тем, что формируется выражение-форма, а потом уже подставляются значения (этот как я понимаю), тоесть организация должна быть та же, но нужно блокировать вычисления?
Пожалуйста помогите.

Это сообщение отредактировал(а) macrox - 11.6.2009, 14:32
PM MAIL   Вверх
macrox
Дата 11.6.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



Код

(setq l (list '(1 2 3) '(4 5 6) '( 7 8 9)))

(defmacro matrix (list1)
    (list 'apply 'mapcar 'list list1)
)


Вот до чего дошел я, тестирование макроса макроэкспандом (macroexpand '(matrix l)) выдает (apply mapcar list l). К сожалению я не знаю правильно ли это, правильное ли это оформление макроса?

Возможна проблема - преподаватель может потребовать чтобы макрос принимал не 1 список , а множество N списков, вот так, к примеру (МАТРИЦА (1 2 3) (4 5 6) (7 8 9)) а не (МАТРИЦА ((1 2 3) (4 5 6) (7 8 9))). Нужно попробовать сделать еще таким способом (это вроде бы возможно сделать используя точечную пару, но я не уверен), кто может - посмотрите пожалуйста, актуально до завтра часов до 9-10 утра.

Добавлено через 1 минуту и 9 секунд
Во втором случае полагаю нужно использовать funcall но как в сам макрос передать эти списки  smile 
PM MAIL   Вверх
macrox
Дата 11.6.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



С точечными парами вообще ничего не ясно, провал полный  smile 
PM MAIL   Вверх
kosmonaFFFt
Дата 11.6.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Если надо множество параметров, попробуй сделать
Код

(defmacro matrix (&rest lists)
    ....)

и с lists работай как со списком, а передавай списки поотдельности друг от друга.
Не уверен, сработает ли это в макросах, но на функциях так указываются параметры
с неизвестным их числом...
Примерно так... smile


--------------------
user posted image
PM MAIL ICQ   Вверх
macrox
Дата 12.6.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



Спасибо, попробую. 
(&rest lists) воспринимаются как 2 параметра :( и работатет только для двух списков.
PM MAIL   Вверх
macrox
Дата 12.6.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



Все сделал, сдал. Спасибо тем, кто помог.
PM MAIL   Вверх
macrox
Дата 13.6.2009, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.6.2009

Репутация: нет
Всего: нет



Если решение кому-нибудь надо - пишите в тему, я буду сюда заглядывать иногда. Хороший форум.
PM MAIL   Вверх
BigLes
Дата 23.5.2010, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.1.2010

Репутация: нет
Всего: нет



дядька, кинь код пожалуйста, мне нужна точно такая же задача

может кто-то сможет помочь, ато я не шарю

Это сообщение отредактировал(а) BigLes - 23.5.2010, 07:53
PM MAIL   Вверх
k0rvin
Дата 29.5.2010, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Цитата(macrox @ 11.6.2009,  21:50)
С точечными парами вообще ничего не ясно, провал полный  smile

точечная пара это cons-ячейка:
'(1 . 2)
список -- частный случай:
'(1 . NIL) ; эквивалентно '(1)

PS. Оформление макроса у Вас правильное, за исключением последней скобки -- её не нужно переносить на новую строку -- это плохой стиль

Добавлено через 1 минуту и 16 секунд
Цитата(macrox @ 12.6.2009,  09:18)
Спасибо, попробую. 
(&rest lists) воспринимаются как 2 параметра :( и работатет только для двух списков.

это потому, что Вы используете не Common Lisp, а какой-то другой, старый и ненужный... =)


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.5588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.