Common lisp 动态绑定变量:还原到以前的状态
我试图理解变量的动态绑定和词汇绑定。 我在浏览SO和一些链接时,遇到了一个问题: 我运行了以下代码:Common lisp 动态绑定变量:还原到以前的状态,common-lisp,Common Lisp,我试图理解变量的动态绑定和词汇绑定。 我在浏览SO和一些链接时,遇到了一个问题: 我运行了以下代码: (let ((a 1)) (let ((f (lambda () (print a)))) (let ((a 2)) (funcall f)))) 预期结果:1(以及一条警告,指出第二个a变量未使用,这是正常的) 接下来,我尝试: (defvar a 99) 然后重新运行第一个代码。结果是2,如教程所述。然后,为了进一步实验,我尝试删除动态绑定变量a,再次得到1 我
(let ((a 1))
(let ((f (lambda () (print a))))
(let ((a 2))
(funcall f))))
预期结果:1
(以及一条警告,指出第二个a
变量未使用,这是正常的)
接下来,我尝试:
(defvar a 99)
然后重新运行第一个代码。结果是2,如教程所述。然后,为了进一步实验,我尝试删除动态绑定变量a
,再次得到1
我尝试了(makunbund'a)
甚至(setqa55)
(我在默认情况下尝试了这个,我认为如果我理解正确,全局词汇绑定取决于实现…)makunbund
似乎删除了符号,但“动态绑定状态”似乎仍被保存。结果仍然是2
如何将Common Lisp重置为以前的状态(在动态绑定a
变量之前)?重启粘液做的把戏,但我宁愿有一个方法来做它的编程
谢谢您的回答。没有可移植的方法还原
反倾销。
(提议)
)
但是,您可以使用
在某种程度上:这将使新代码将您的符号视为非符号
特殊
因为它现在是一个不同的符号:
现在,让我们尝试“还原”:
哎呀!让我们看看:
(fdefinition 'test-a)
#<FUNCTION TEST-A NIL (DECLARE (SYSTEM::IN-DEFUN TEST-A))
(BLOCK TEST-A
(LET ((#:A 1)) (LET ((F (LAMBDA NIL (PRINT #:A)))) (LET ((#:A 2)) (FUNCALL F)))))>
又来了 问题是
a
被宣布为特殊。我认为这是不可能撤销的。因此,最好不要使用像a
这样的变量名,而是按照惯例命名特殊变量*a*
。谢谢。我不知道术语特殊变量
。我确实读过*变量名*
约定,如果不可能删除特殊声明,我会更好地理解它。Common Lisp可以将它们称为动态变量,由DEFVAR、DEFPARAMETER、特殊声明等声明。。。谢谢,我不知道这个函数是在保存旧的符号。
(unintern 'a)
(test-a)
==> 2
(fdefinition 'test-a)
#<FUNCTION TEST-A NIL (DECLARE (SYSTEM::IN-DEFUN TEST-A))
(BLOCK TEST-A
(LET ((#:A 1)) (LET ((F (LAMBDA NIL (PRINT #:A)))) (LET ((#:A 2)) (FUNCALL F)))))>
(test-a)
==> 1