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

在LISP中,如何检查闭包中的自由变量?,lisp,closures,scope,lexical-scope,Lisp,Closures,Scope,Lexical Scope,在lisp中,我可以像这样绑定在闭包中的自由变量 (let ((x 1) (y 2) (z 3)) (defun free-variables () (+ x y z))) (free-variables) 结果 6 我想知道的是,是否可以动态检查绑定闭包变量 例如 导致类似于 ((x 1) (y 2) (z 3)) 非常感谢,您可以在一个机柜中拥有多个功能,因此只需添加另一个功能即可 (defun inspect-closure () (list (list 'x x) (list

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

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

(free-variables)
结果

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

例如

导致类似于

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

非常感谢,您可以在一个机柜中拥有多个功能,因此只需添加另一个功能即可

(defun inspect-closure () (list (list 'x x) (list 'y y) (list 'z z)))
并将其放入您的
let
语句中


如果您试图创建一个可以访问任意闭包的函数,那么严格地说,我认为这是不可能的。x、 y和z是本地定义的,所以如果你想向世界宣布它们,它必须来自闭包。您可以做的是构建一个宏,该宏复制
let
功能,并添加返回其局部变量的功能。你可能会想给它起个不同的名字,比如mylet或其他任何东西。

Common Lisp

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


显然,在许多情况下,单个公共Lisp实现知道如何获取这些信息。例如,如果您查看GNU Emacs的SLIME代码(一个常见的Lisp开发环境),inspect和backtrace功能的代码应该提供这一点。开发人员希望向用户/程序员展示这一点——通用Lisp标准没有提供这方面的信息。

谢谢Jeff,但我正在寻找对封闭变量的编程访问,如列表或检查类型函数。显然,标准CL中不支持它。然后我认为,根据我回答的第二部分,您最好的选择是创建一个宏。对不起,我们帮不上忙了!
(defun inspect-closure () (list (list 'x x) (list 'y y) (list 'z z)))