6

在 lisp 中,我可以像这样绑定绑定在闭包中的自由变量...

(let ((x 1) (y 2) (z 3))
  (defun free-variables () (+ x y z)))

(free-variables)

结果是 ...

6

我想知道的是是否可以动态检查绑定的闭包变量?

例如

(inspect-closure free-variables)

导致类似...

((x 1) (y 2) (z 3))

谢谢所以

4

2 回答 2

7

通用 Lisp

只能从同一范围内的函数访问闭包的内部变量(参见 Jeff 的回答)。即使是那些也无法在某处查询这些变量。Common Lisp 标准不提供此功能。

显然,在许多情况下,单独的 Common Lisp 实现知道如何获取这些信息。例如,如果您查看 GNU Emacs 的 SLIME 代码(Common Lisp 开发环境),则检查回溯功能的代码应该提供该代码。开发人员希望展示这一点——对于用户/程序员,Common Lisp 标准不提供该信息。

于 2011-05-29T11:53:12.980 回答
4

您可以在一个外壳内拥有多个功能,因此只需添加另一个功能

(defun inspect-closure () (list (list 'x x) (list 'y y) (list 'z z)))

并将其放入您的let声明中

如果您正在尝试创建一个可以访问 -any- 闭包的函数,那么严格来说,我认为这是不可能的。x、y 和 z 是在本地定义的,所以如果你想向世界宣布它们,它必须来自闭包内。您可以做的是构建一个复制let功能的宏,并增加了返回其局部变量的能力。您可能想要将其命名为不同的名称,例如mylet或其他名称。

于 2011-05-29T03:56:11.853 回答