gpt4 book ai didi

scope - Common Lisp (SBCL) 中的动态变量闭包

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:50 27 4
gpt4 key购买 nike

我明白这段代码是如何工作的:

(defvar *nums* '(2 3 5))

(defun print-nums ()
(format t "~a~%" *nums*))

(print-nums)
-> (2 3 5)
-> NIL

我什至明白动态绑定(bind)变量 *nums* 的新值是如何在这段代码中传递给 print-nums 的:

(let ((*nums* '(1 2 3)))
(print-nums))
-> (1 2 3)
-> NIL

但为什么下面的代码不能以同样的方式工作?

(defvar *my-nums-f* (let ((*nums* '(1 2 3)))
#'(lambda () (format t "~a~%" *nums*))))

(funcall *my-nums-f*)
-> (2 3 5)
-> NIL

闭包的概念不适用于动态绑定(bind)变量,还是我做错了什么?如果我错误地理解了闭包的概念,谁能给我解释一下?

最佳答案

(defvar *my-nums-f* (let ((*nums* '(1 2 3)))
#'(lambda () (format t "~a~%" *nums*))))

这里我们设置*my-nums-f*

的结果
(let ((*nums* '(1 2 3)))
#'(lambda () (format t "~a~%" *nums*)))

这种形式首先动态绑定(bind)*nums*'(1 2 3),然后返回#'(lambda() (format t "~ a~%"*nums*)),这是一个函数。最后,我们将 *nums* 重置为 '(2 3 5)

(funcall *my-nums-f*)

这里我们调用存储在*my-nums-f*中的函数,即(lambda() (format t "~a~%"*nums*))。此函数采用 *nums* 的当前值,即 '(2 3 5)

-> (2 3 5)
-> NIL

您似乎期望 lambda 以某种方式内联函数主体中使用的所有变量的当前值,这确实会导致 (format t "~a~%"'( 1 2 3)) 在这一点上。

但这不是它的工作方式:函数引用变量本身,而不是变量值的快照。这就是为什么该函数在调用时会看到 *nums* 的当前值。

关于scope - Common Lisp (SBCL) 中的动态变量闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38028483/

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