Cha*_*ois 3 closures common-lisp dynamic-binding
诚实地说,我不确定我是否完全理解"动态"与"词汇"的约束意味着什么.但据我所知,当我使用defvar
或defparameter
定义绑定时,1.它声明了一个全局变量2.绑定被声明为"特殊",因此它可以被新的本地绑定所遮蔽,例如
(defvar *x* 3)
(defun f () *x*)
(f) ;=>3
(let ((*x* 2)) (f));=>2
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是,是否有可能具有相同属性的局部绑定(即不污染全局环境的绑定)(即可以被"外部"/"更新"绑定遮蔽)?
例:
(special-binding ((x 1)) (defun f () x))
(f);=>1
x;=>error, no binding in the global environment
(let ((x 2)) (f));=>2
Run Code Online (Sandbox Code Playgroud)
我尝试(special x)
在let
块中使用声明,或者(locally (declare (special x)) ...)
,但它似乎没有创建闭包(要求从定义的函数中的变量值触发"未绑定变量"错误).
您无法捕获闭包中的动态绑定,只能捕获词法绑定.
您需要在函数中声明变量special,因此它将使用动态绑定:
(defun f ()
(declare (special x))
x)
Run Code Online (Sandbox Code Playgroud)
然后,您需要在调用周围动态绑定变量,具有:
(let ((x 1))
(declare (special x))
(f))
Run Code Online (Sandbox Code Playgroud)