2011-02-16 47 views
5

我可愛的功能:的elisp:從內部功能捕捉變量

(defun f (x) 
    (lambda (y) (+ x y))) 

於是,我想到這一點:

(funcall (f 2) 2) 

要返回4.但是,唉,我得到這個:

Debugger entered--Lisp error: (void-variable x) 

所以,我怎麼能捕獲從內部函數變量?

+3

作爲Emacs的24,有對動態作用域「錯誤」的另一個解決方法:你可以把`;; - * - 詞法綁定:t - * - `在文件的頂部,以啓用詞法作用域。如果你這樣做,上面的代碼按預期運行。 – 2012-10-02 17:05:30

回答

7

你被elisp的的動態作用域咬傷。在lambda的x指變量x是在範圍上,當拉姆達被調用(並因爲在這種情況下,在範圍上沒有x當你調用它,你會得到一個錯誤),而不是到x這是在範圍當你創建lambda時。

模擬在elisp的詞彙閉包的一些方法是在this page on the EmacsWiki解釋。