gpt4 book ai didi

closures - common lisp 中的局部动态绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 09:22:42 24 4
gpt4 key购买 nike

老实说,我不确定我是否完全理解绑定(bind)是“动态”与“词法”的含义。但我明白,当我使用 defvardefparameter 定义绑定(bind)时,1. 它声明了一个全局变量 2. 绑定(bind)被声明为“特殊”,因此它可以被新的本地绑定(bind)遮蔽,例如

(defvar *x* 3)
(defun f () *x*)
(f) ;=>3
(let ((*x* 2)) (f));=>2

现在,我的问题是,是否有可能拥有具有相同属性的本地绑定(bind)(即不会污染全局环境的绑定(bind))(即可以被“外部”/“较新”遮蔽)绑定(bind))?

例子:

(special-binding ((x 1)) (defun f () x))
(f);=>1
x;=>error, no binding in the global environment
(let ((x 2)) (f));=>2

我尝试在 let block 中使用 (special x) 声明,或 (locally (declare (special x)) ...) ,但它似乎没有创建闭包(从以这种方式定义的函数中请求变量的值会触发“未绑定(bind)变量”错误)。

最佳答案

您不能在闭包中捕获动态绑定(bind),只能捕获词法绑定(bind)。

你需要在函数中声明变量special,所以它会使用动态绑定(bind):

(defun f () 
(declare (special x))
x)

然后你需要在调用周围动态绑定(bind)变量,使用:

(let ((x 1))
(declare (special x))
(f))

关于closures - common lisp 中的局部动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30720974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com