我看到实用的Common Lisp使用(defvar *db* nil)
设立一个全局变量.是否可以setq
用于同一目的?
使用defvar
vs. 的优点/缺点是setq
什么?
编辑:我在第一个答案后更改了示例代码,因为我提出了一个简单的版本,提出相同的问题.
我目前正在学习Common Lisp的范围属性.在我认为我有一个扎实的理解后,我决定编写一些我可以预测结果的例子,但显然我错了.我有三个问题,每个问题都与下面的例子有关:
例1:
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
*** - EVAL: variable X has no value
Run Code Online (Sandbox Code Playgroud)
问题:这是有道理的.x是静态范围的,fun2无法在没有显式传递的情况下找到x的值.
例2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
5
Run Code Online (Sandbox Code Playgroud)
问题:我不明白为什么x对fun2突然可见,其值为fun1,而不是值为100 ...
例3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
100
Run Code Online (Sandbox Code Playgroud)
问题:我是否应该忽略这些结果,因为在未声明的变量上调用setf显然是未定义的?这恰好是我在第二个例子中所期望的......
任何见解将不胜感激......