![]() |
|
|
![]()
|
|
| macrox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 10.6.2009 Репутация: нет Всего: нет |
Ребята, срочно нужна помощь. Задание:
Сформировать макрос новой формы (МАТРИЦА (список1)(список2)...(списокN)) собрать все списки в один такой : ((голова1...головаN) (второйэлемент1...второйэлементN)... (Nэлемент1...NэлементN)) Макрос должен быть как можно меньше по байтам. Среда - mulisp. Отблагодарю чем смогу, проблема только в сроках - завтра - макс. послезавтра нужно сдать. |
|||
|
||||
| VH_ |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 10 Всего: 11 |
Вы уточните, пожалуйста, действительно ли Вам необходим именно macro - дело в том, что эта задача весьма элегантно решается посредством function:
|
||||
|
|||||
| macrox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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))), возврат такой же. Ваш код при таких вызовах не работает, или я что-то не понял, напишите пожалуйста пример. Спасибо что помогаете. |
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Код, написанный выше принимает списки, а ты передаешь список списков, вот он и не работает...
-------------------- ![]() |
|||
|
||||
| macrox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 10.6.2009 Репутация: нет Всего: нет |
Если передавать в качестве параметров 3 списка '(1 2 3) '(4 5 6) '(7 8 9) то все работает, если больше или меньше - нет. как я понимаю список1 список2... списокN воспринимаются просто как 3 списка, а нужно чтоб работало любое количество списков:( Переделать эту ф-цию под макрос реально? Я знаю что макрос отличается от ф-ции тем, что формируется выражение-форма, а потом уже подставляются значения (этот как я понимаю), тоесть организация должна быть та же, но нужно блокировать вычисления? Пожалуйста помогите. Это сообщение отредактировал(а) macrox - 11.6.2009, 14:32 |
|||
|
||||
| macrox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 10.6.2009 Репутация: нет Всего: нет |
Вот до чего дошел я, тестирование макроса макроэкспандом (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 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 10.6.2009 Репутация: нет Всего: нет |
С точечными парами вообще ничего не ясно, провал полный
|
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Если надо множество параметров, попробуй сделать
и с lists работай как со списком, а передавай списки поотдельности друг от друга. Не уверен, сработает ли это в макросах, но на функциях так указываются параметры с неизвестным их числом... Примерно так... -------------------- ![]() |
|||
|
||||
| macrox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 10.6.2009 Репутация: нет Всего: нет |
Спасибо, попробую.
(&rest lists) воспринимаются как 2 параметра :( и работатет только для двух списков. |
|||
|
||||
| macrox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 10.6.2009 Репутация: нет Всего: нет |
Все сделал, сдал. Спасибо тем, кто помог.
|
|||
|
||||
| macrox |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 10.6.2009 Репутация: нет Всего: нет |
Если решение кому-нибудь надо - пишите в тему, я буду сюда заглядывать иногда. Хороший форум.
|
|||
|
||||
| BigLes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 12.1.2010 Репутация: нет Всего: нет |
дядька, кинь код пожалуйста, мне нужна точно такая же задача
может кто-то сможет помочь, ато я не шарю Это сообщение отредактировал(а) BigLes - 23.5.2010, 07:53 |
|||
|
||||
| k0rvin |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: нет Всего: 5 |
точечная пара это cons-ячейка: '(1 . 2) список -- частный случай: '(1 . NIL) ; эквивалентно '(1) PS. Оформление макроса у Вас правильное, за исключением последней скобки -- её не нужно переносить на новую строку -- это плохой стиль Добавлено через 1 минуту и 16 секунд
это потому, что Вы используете не Common Lisp, а какой-то другой, старый и ненужный... =) -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
||||
|
|||||
![]()
|
| Правила форума LISP | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | LISP | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |