常见的lisp中的本地动态绑定

Cha*_*ois 3 closures common-lisp dynamic-binding

诚实地说,我不确定我是否完全理解"动态"与"词汇"的约束意味着什么.但据我所知,当我使用defvardefparameter定义绑定时,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)) ...),但它似乎没有创建闭包(要求从定义的函数中的变量值触发"未绑定变量"错误).

Bar*_*mar 5

您无法捕获闭包中的动态绑定,只能捕获词法绑定.

您需要在函数中声明变量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)