2011-02-16 49 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解释。