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