【发布时间】:2019-04-21 21:13:35
【问题描述】:
当我想测试locally 和declare 时,我刚刚在我的普通lisp 代码中遇到了一个不寻常的情况:
(defvar test-out 2) ;; make a dynamic variable
;; function below just simply re-write from locally doc
(defun test (out)
(declare (special out))
(let ((out 1))
(print out) ;; => 1
(print (locally (declare (special out)) out)))) ;; => 2
;; when argument has same name as outside dynamic variable
(defun test1 (test-out)
(declare (special test-out))
(let ((test-out 1))
(print test-out) ;; => 1
(print (locally (declare (special test-out)) test-out)))) ;; => also 1
我知道动态变量的正确名称应该是*test-out*,但我认为它只是为了方便程序员告诉动态变量。
我对@987654325@ 函数有点困惑,看起来locally declare 没有将test-out 指向外部的动态变量。
谁能向我解释test1 函数的行为?谢谢
更新:
- 我给了一个新的动态变量
(defvar test-out-1 3),像(test1 test-out-1)一样调用它,仍然得到打印结果1和1。 - 我将
test1的参数名称从test-out更改为test-out1,重新编译test1,问题消失,当我调用(test1 test-out)时,打印输出结果为1和2。李> - 我将
(defvar test-out 2)更改为(defvar test-out-1 2)(更改动态变量名称)。然后重新编译整个文件(这次没有动态变量叫test-out,test1参数的名字是test-out),问题就消失了。 -
3后,我打电话给
(defvar test-out 2)和(test1 test-out)。这一次,它打印出正确的答案:1和2。 -
4之后,我再次重新编译
test1,然后运行(test1 test-out),又打印出1和1,问题又出现了。
如果我猜对了,当test1 编译时,由于某种原因,它的参数名称连接到动态变量test-out。这就是为什么我什至使用不同的值调用时都会收到错误的结果,但是,当我在重新编译测试之前使用不同的参数名称或干净的动态变量 test-out 重新编译 test1 时,问题会自行解决。
如果是这样,我还是不明白为什么编译函数会受到环境中的动态变量的影响。
【问题讨论】:
标签: lisp common-lisp dynamic-binding