Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Макрос и функция 
V
    Опции темы
Макрос и функция
  Дата 25.11.2005, 22:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите разобраться в различиях макросов и функицй.
В Чем разница???
Вот код который преобразует список в одноуровневый:

Код


(defun one(l) 
    (cond 
          ((null l) nil) 
          ((atom l) (list l)) 
          (t (append (one (car l)) (one(cdr l)))) 
    ) 
) 

(defmacro one2(L) 
    (cond 
          ((null l) nil) 
          ((atom l)(list 'list l)) 
          (t (list 'append (list 'one2 (car l)) (list 'one2 (cdr l)))) 
    ) 
)


  Вверх
svg
Дата 26.11.2005, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Разница в том, что макрос выполняется в две стадии:
- сначала он расширяется, при этом его аргументы никак не интерпретируются;
- возвращаемая форма выполняется в текущем окружении.

Лучше всего тренироваться, расширяя макросы с помощью функции makroexpand, которая
возвращает результат первой стадии выполнения макроса:

Код

(macroexpand `(one2 '(1 2 3)))
=> (APPEND (ONE2 QUOTE) (ONE2 ((1 2 3))))


из чего видно, что реализация ONE2 в основоном бесполезна, так как аргументы ей можно
передать только статически, через eval или только используя ее в другом макросе.

PM MAIL   Вверх
Cr@$h
Дата 24.8.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

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




M
Cr@$h
svg, получай + по репе.

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

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

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


 




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


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

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