在LISP中如何检查闭包中的自由变量?

时间:2011-05-29 03:48:46

标签: lisp closures scope lexical-scope

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

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

(free-variables)

导致......

6

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

E.g。

(inspect-closure free-variables)

导致类似......

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

非常感谢

2 个答案:

答案 0 :(得分:7)

Common Lisp

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

显然,在许多情况下,各个Common Lisp实现都知道如何获取此信息。如果您在GNU Emacs的SLIME代码(Common Lisp开发环境)中查找示例, inspect backtrace 功能的代码应提供该代码。开发想要证明这一点 - 对于用户/程序员,Common Lisp标准不提供该信息。

答案 1 :(得分:4)

您可以在机箱内部使用多个功能,因此只需添加其他功能

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

并将其放入let声明

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