Common lisp 动态绑定变量:还原到以前的状态

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 我

我试图理解变量的动态绑定和词汇绑定。 我在浏览SO和一些链接时,遇到了一个问题:

我运行了以下代码:

(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