![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
vikko |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 25.11.2008 Репутация: нет Всего: нет |
Здравствуйте, люди добрые!!!
Помогите, пж-ж-ж-ж… с последней лабой. Никак не могу разобраться с макросами. Надо написать макрос, некий вариант setq , который берёт несколько переменных и присваивает им одновременно значение (которое тоже может вычисляться). Первый аргумент – список, в котором каждый элемент является переменной. И каждому элементу присваивается значение второго аргумента. Нельзя использовать eval или apply, зато надо написать несколькими возможными способами (буду чрезвычайно бдагодарна за единственную подсказку) Извините, если слишком заумно :-((( Вызов: (setqlist (a b c) (+ 1 2)) Макрос должен вернуть 3 и каждый элемент должен быть равен 3. |
|||
|
||||
adejneka |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 2 Всего: 11 |
1. Макрос принимает на вход список переменных и присваиваемой значение, значит он должен быть описан так:
Второй способ лично мне нравится больше. 2. Простейшая реализация: Ваш пример раскрывается в (PROGN (SETQ A (+ 1 2)) (SETQ B (+ 1 2)) (SETQ C (+ 1 2)) (+ 1 2)):
Проблема: второй аргумент SETQLIST вычисляется несколько раз. Если он не производит содержит побочных эффектов, такое вычисление приводит лишь к напрасной трате времени. Если же побочные эффекты есть (например, в (SETQ (A B) (PRINT (+ 1 2)))), то соответствующие действия будут выполнены несколько раз, что в Common Lisp не принято. 3. Решение: надо сохранить значение второго аргумента во временной переменной, а затем использовать её. Т.е. Ваш пример раскрывается в
Написать код такого макроса я предлагаю Вам ![]() Проблема: как подобрать имя временной переменной, заведомо отличное от a, b, c... (у меня - ``.VAL.'', имя начинается и заканчивается точкой; такой способ именования переменных в макросах принят в библиотеке Portable Common Loops)? 4. Надёжное решение: имя переменной - символ; уникальный символ создаётся функцией GENSYM. 5. Если список переменных не пуст, последнюю ссылку на .VAL. в LET можно убрать - в Common Lisp оператор SETQ возвращает присвоенное значение. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |