我正在阅读《LISP之国》这本书,目前在第一章节中。其中有一个小程序,计算机会猜测1到100之间的数字。其代码如下:
(defparameter *small* 1)
(defparameter *big* 100)
(defun guess-my-number ()
(ash (+ *small* *big*) -1))
(defun smaller ()
(setf *big* (1- (guess-my-number)))
(guess-my-number))
(defun bigger ()
(setf *small* (1+ (guess-my-number)))
(guess-my-number))
(defun start-over ()
(defparameter *small* 1)
(defparameter *big* 100)
(guess-my-number))
到目前为止,我理解发生了什么,并且在LISP中使用'ash'执行二进制搜索对此帮助很大。然而,还有一件事情让我困惑:据我所学,您使用
setf
为变量分配值,使用defparameter
来最初定义变量。我也理解了defparameter
和defvar
之间的区别(至少我认为我理解了;-))。那么现在我的问题是:如果我应该使用setf
为已初始化的变量分配值,那么为什么start-over
函数使用defparameter
而不是setf
?这是有特殊原因呢,还是只是粗心大意?
defconstant
。它只要求变量的值永远不会改变(常量变量)。 - schauehodefconstant
视为defparameter
,并且仍然符合标准,因为程序员被禁止重新定义。 - Sylwester