| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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:
|
| Автор: 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 | ||
Если передавать в качестве параметров 3 списка '(1 2 3) '(4 5 6) '(7 8 9) то все работает, если больше или меньше - нет. как я понимаю список1 список2... списокN воспринимаются просто как 3 списка, а нужно чтоб работало любое количество списков:( Переделать эту ф-цию под макрос реально? Я знаю что макрос отличается от ф-ции тем, что формируется выражение-форма, а потом уже подставляются значения (этот как я понимаю), тоесть организация должна быть та же, но нужно блокировать вычисления? Пожалуйста помогите. |
| Автор: macrox 11.6.2009, 20:58 | ||
Вот до чего дошел я, тестирование макроса макроэкспандом (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 но как в сам макрос передать эти списки |
| Автор: macrox 11.6.2009, 21:50 |
| С точечными парами вообще ничего не ясно, провал полный |
| Автор: kosmonaFFFt 11.6.2009, 23:06 | ||
Если надо множество параметров, попробуй сделать
и с lists работай как со списком, а передавай списки поотдельности друг от друга. Не уверен, сработает ли это в макросах, но на функциях так указываются параметры с неизвестным их числом... Примерно так... |
| Автор: 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 | ||||
точечная пара это cons-ячейка: '(1 . 2) список -- частный случай: '(1 . NIL) ; эквивалентно '(1) PS. Оформление макроса у Вас правильное, за исключением последней скобки -- её не нужно переносить на новую строку -- это плохой стиль Добавлено через 1 минуту и 16 секунд
это потому, что Вы используете не Common Lisp, а какой-то другой, старый и ненужный... =) |