5
我可愛的功能:的elisp:從內部功能捕捉變量
(defun f (x)
(lambda (y) (+ x y)))
於是,我想到這一點:
(funcall (f 2) 2)
要返回4.但是,唉,我得到這個:
Debugger entered--Lisp error: (void-variable x)
所以,我怎麼能捕獲從內部函數變量?
我可愛的功能:的elisp:從內部功能捕捉變量
(defun f (x)
(lambda (y) (+ x y)))
於是,我想到這一點:
(funcall (f 2) 2)
要返回4.但是,唉,我得到這個:
Debugger entered--Lisp error: (void-variable x)
所以,我怎麼能捕獲從內部函數變量?
你被elisp的的動態作用域咬傷。在lambda的x
指變量x
是在範圍上,當拉姆達被調用(並因爲在這種情況下,在範圍上沒有x
當你調用它,你會得到一個錯誤),而不是到x
這是在範圍當你創建lambda時。
模擬在elisp的詞彙閉包的一些方法是在this page on the EmacsWiki解釋。
作爲Emacs的24,有對動態作用域「錯誤」的另一個解決方法:你可以把`;; - * - 詞法綁定:t - * - `在文件的頂部,以啓用詞法作用域。如果你這樣做,上面的代碼按預期運行。 – 2012-10-02 17:05:30