Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Срочно, прошу помощи (макросы в lisp)


Автор: macrox 10.6.2009, 22:18
Ребята, срочно нужна помощь. Задание:
Сформировать макрос новой формы (МАТРИЦА (список1)(список2)...(списокN)) собрать все списки в один такой : 
((голова1...головаN) (второйэлемент1...второйэлементN)... (Nэлемент1...NэлементN))
Макрос должен быть как можно меньше по байтам. Среда - mulisp.
Отблагодарю чем смогу, проблема только в сроках - завтра - макс. послезавтра нужно сдать.

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

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

Автор: macrox 11.6.2009, 07:46
Да, мне нужен именно макрос, при чем я лично дошел до того что он должен быть рекурсивным -  обход по первым элементам списков, урезание главного списка (избавление от этих всех элементов) и так далее пока список не пуст. Но реализовать мне это не удается :(Я полагаю что решением задачи должен быть макрос, с вызовом, к примеру таким:
(МАТРИЦА (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))), возврат такой же. Ваш код при таких вызовах не работает, или я что-то не понял, напишите пожалуйста пример.
Спасибо что помогаете.

Автор: kosmonaFFFt 11.6.2009, 12:23
Код, написанный выше принимает списки, а ты передаешь список списков, вот он и не работает...

Автор: macrox 11.6.2009, 14:31
Код

(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, 20:58
Код

(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 

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

Автор: kosmonaFFFt 11.6.2009, 23:06
Если надо множество параметров, попробуй сделать
Код

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

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

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

Автор: macrox 12.6.2009, 18:15
Все сделал, сдал. Спасибо тем, кто помог.

Автор: macrox 13.6.2009, 01:53
Если решение кому-нибудь надо - пишите в тему, я буду сюда заглядывать иногда. Хороший форум.

Автор: BigLes 23.5.2010, 07:26
дядька, кинь код пожалуйста, мне нужна точно такая же задача

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

Автор: k0rvin 29.5.2010, 01:16
Цитата(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, а какой-то другой, старый и ненужный... =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)