【问题标题】:elisp: capturing variable from inner functionelisp:从内部函数中捕获变量
【发布时间】:2011-02-16 17:41:53
【问题描述】:

我可爱的功能:

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

那么,我希望是这样的:

(funcall (f 2) 2)

返回 4。但可惜的是,我得到了这个:

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

那么如何从内部函数中获取变量呢?

【问题讨论】:

  • 从 Emacs 24 开始,动态范围“错误”还有另一种解决方法:您可以将 ;; -*- lexical-binding: t -*- 放在文件顶部以启用词法范围。如果你这样做,上面的代码会按预期运行。

标签: elisp


【解决方案1】:

您已被 elisp 的动态作用域所困扰。 lambda 中的 x 指的是调用 lambda 时范围内的变量 x(因为在这种情况下,当您调用它时,范围内没有 x,您会收到错误),而不是x 创建 lambda 时在范围内。

在 elisp 中模拟词法闭包的一些方法在 this page on the EmacsWiki 上进行了解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2011-03-31
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多