【发布时间】:2017-05-20 11:42:24
【问题描述】:
例如在 Common Lisp 中的 let 中
(let ((a 5)) (print a))
a 和 defparameter 一样是可变的,还是 a 和 defvar 一样是恒定的?
【问题讨论】:
-
常量是用
DEFCONSTANT创建的,而不是DEFVAR。
标签: lisp common-lisp let
例如在 Common Lisp 中的 let 中
(let ((a 5)) (print a))
a 和 defparameter 一样是可变的,还是 a 和 defvar 一样是恒定的?
【问题讨论】:
DEFCONSTANT创建的,而不是DEFVAR。
标签: lisp common-lisp let
您可以更改 a 绑定的内容,即使 a 引用其他内容:
(let ((a 5)) (setf a 10))
如果a引用的值是可变的,你可以改变它:
(let ((a (list 5))) (setf (first a) 10))
是像 defparameter 一样是可变的,还是像 defvar 一样是常量?
不,DEFVAR 没有定义常量。
(defvar *var* :value)
(setf *var* 5)
然后:
*var*
=> 5
当您评估DEFVAR 表单时会发生什么情况,它首先检查该符号是否已绑定。如果是这种情况,则保留现有值。另一方面,DEFPARAMETER 总是重新初始化变量。
【讨论】:
这里有一些例子可以说明这一点。你可以在 repl 上试试。试着想想他们更像defvar还是defparameter
(loop repeat 2 do
(let ((a 1)) (print a) (setf a 5) (print a)))
(loop repeat 2 do
(let ((a (list 1 2)))
(print (first a))
(setf (first a) 5)
(print (first a))))
(loop repeat 2 do
(let ((a '(1 2)))
(print (first a))
(setf (first a) (+ (first a) 5))
(print (first a))))
希望这些示例可以帮助您更好地了解 let 的作用。当您将第三个示例放入 repl 时会发生什么实际上取决于实现,与 let 几乎没有关系,而与 quote 有更多关系。
【讨论】: