2014-01-06 47 views
8

有人告訴我,我不應該在報價拉姆達,比方說,爲什麼不引用lambda?

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

我想,的確,如果我不引用拉姆達,它同樣適用

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

不過,我不不明白爲什麼後者會起作用(也是首選,現在後者起作用,爲什麼前者也起作用)。

如果lambda表達式定義爲其他功能,我們會叫

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

,以防止我的功能將立即評估。我將lambda表達式理解爲my函數的匿名版本。那麼爲什麼不應該引用lambda呢?

謝謝!

+1

順便一提,矢量文字也是「自引用」,所以沒有必要引用它們。 – gsg

+1

不完全重複,但請參閱[何時應使用Emacs#的函數語法?](http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used) – phils

回答

9

使用C-h f lambda <RET>

形式(拉姆達ARGS文檔字符串INTERACTIVE BODY) 是自引用的呼叫;評估lambda表達式 的結果是表達式本身。

所以,這回答了這個問題,爲什麼你不需要引用lambda表達式。至於你爲什麼不應該這樣做...我認爲,這與字節編譯有關。引用的lambda表達式只是簡單的數據。字節碼編譯器別無選擇,只能將表達式作爲常量列表文字包含在其輸出中。另一方面,不加引號的lambda表達式可以編譯爲字節碼,從而加快執行速度。

形式(lambda (...) ...)的列表文字是emacs lisp評估程序中的特殊字體,可用作函數。這就是它工作的原因,不管你是否引用lambda表達式。

+2

如果你使用'Ch f函數RET',你可以得到這個:'Like'quote',但是對於函數對象來說是首選的。在字節編譯中,'函數'會導致其參數被編譯。 '報價'不能這樣做'。所以,是的,似乎'quote'的問題是它避免了字節編譯。 – rsenna

+0

請注意,除Emacs Lisp之外的其他Lisp不一定會以這種方式處理'lambda'表單。例如,你可能會看到其他Lisp方言中的'#'(lambda ...)'。在Emacs Lisp中,這與'(lambda ...)'基本相同(但@Dirk指出,與'(lambda ...)'不同)。 – Drew