编辑:在第一个答案之后,我更改了示例代码,因为我想到了一个简单的版本,引发了同样的问题。
我目前正在学习Common Lisp的作用域属性。当我认为自己有一个扎实的理解后,我决定编写一些示例代码,以便我可以预测结果,但显然我错了。我有三个问题,每个问题都涉及以下示例:
示例1:
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
输出:
5
*** - EVAL: variable X has no value
问题:这很有道理。x是静态作用域,fun2没有办法在没有显式传递的情况下找到x的值。
示例2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
输出:
5
5
问题:我不明白为什么 x 突然对 fun2 可见,并且具有 fun1 给它的值,而不是一个值为 100 的初始值...
示例 3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
输出:
5
100
问题:由于在未声明的变量上调用setf显然是未定义的,我是否应该忽略这些结果?这恰好是我在第二个示例中所期望的...
任何见解都将不胜感激...