在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))
非常感谢
答案 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
或其他。