编辑:我在第一个答案后更改了示例代码,因为我想出了一个简单的版本,它提出了同样的问题。
我目前正在学习 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 突然以 fun1 给它的值对 fun2 可见,而不是值为 100...
示例 3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
输出:
5
100
问题:我是否应该忽略这些结果,因为在未声明的变量上调用 setf 显然是未定义的?这恰好是我在第二个示例中所期望的......
任何见解将不胜感激......