2014-01-06 3 views
8

мне сказали, что я не должен цитировать лямбда, скажем,Почему бы не процитировать лямбда?

(global-set-key (quote [f3]) '(lambda() (interactive) (other-window -1))) 

Я попробовал, что на самом деле, если я не цитирую лямбда, он одинаково хорошо работает

(global-set-key (quote [f3]) (lambda() (interactive) (other-window -1))) 

Однако, я не Понимаете, почему последнее работает (и также предпочитается, и теперь последнее работает, почему работает и первое).

Если лямбда-выражение определяется как другой функции, мы назвали бы

(global-set-key (quote [f3]) 'my-function) 

, чтобы предотвратить мою-функцию, которая будет оцениваться немедленно. Я понимаю выражение лямбда как анонимную версию моей функции. Так почему бы не процитировать lambda?

Спасибо!

+1

Между прочим, кстати, и литературные литералы также «цитируют», поэтому их тоже нет. – gsg

+1

Не совсем дубликат, но см. [Когда должен использоваться синтаксис Emacs #?] (Http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used) – phils

ответ

9

Использование C-h f lambda <RET>:

Вызов формы (лямбда АРГС ИНТЕРАКТИВНАЯ ТЕЛА строка документации) само кавычки; результатом оценки лямбда-выражения является само выражение.

Итак, это отвечает на вопрос, почему вам не нужно указывать выражение лямбда. Что касается того, почему вы не должны этого делать ... Я думаю, это связано с составлением байтов. Выраженное выражение лямбда - это просто простые данные. Компилятор байтового кода не имеет никакого выбора, кроме как включить выражение в литературу с постоянным списком в свой вывод. С другой стороны, некорректное лямбда-выражение может быть скомпилировано в байтовый код, что приводит к более быстрому выполнению.

Литералы формы (lambda (...) ...) являются специализированными специалистами по оценке emacs lisp и могут использоваться как функции. Вот почему это работает, независимо от того, цитируете ли вы выражение лямбда или нет.

+2

И если вы используете 'Ch f function RET', вы получаете это:' Like 'quote', но предпочитаете для объектов, которые являются функциями. В байтовой компиляции функция «function» вызывает компиляцию своего аргумента. «quote» не может этого сделать ». Итак, да, кажется, проблема с 'quote' заключается в том, что он избегает компиляции байтов. – rsenna

+0

И имейте в виду, что другие Lisps, кроме Emacs Lisp, не обязательно обрабатывают формы lambda. Таким образом, вы можете увидеть, например, '# '(лямбда ...)' в других диалектах Лиспа. В Emacs Lisp это рассматривается по существу так же, как '(lambda ...)' (но, как отметил @Dirk, не то же самое, что '' (lambda ...) '). – Drew

Смежные вопросы