2015-01-29 2 views
2

Вот краткое определение макроса лямбда взято из subr.el.lambda macro in elisp

(defmacro lambda (&rest cdr) 
     (list 'function (cons 'lambda cdr))) 

Факт, это рекурсивный макрос, который помещает меня в исправление. может кто-нибудь объяснить, как это работает &, что она возвращает:

(list 'function (cons 'lambda cdr)) 

ответ

4

Причина, по которой это не рекурсивный макрос, заключается в том, что function действует как quote тем, что он предотвращает оценку его аргумента. Поэтому рекурсивный вызов макроса lambda не будет выполнен.

Разница между function и quote что function допускает байт компиляции своего аргумента, в то время как quote всегда сохраняет его дословно. Таким образом, если вы напишете (lambda() 1), он будет расширен до (function (lambda() 1)), а затем заменен байтовым кодом компилятором.

2

Это не рекурсивный макрос. Макросы Emacs Lisp имеют форму (SYMBOL...). Только такая форма определяется как макрос и расширяется. Внесение символа lambda в тело определения макроса не разворачивается. Это (, за которым следует символ lambda и возможно пустой список sexps, а затем ), который сопоставляется и расширяется.

Расширение макрокоманды возвращает список (function (lambda CDR)), где CDR является (неоценимым) списком sexps, переданным в качестве аргументов макросу. Когда оценивается список, он возвращает список (lambda CDR) с тем же (неоцененным) CDR.