变量是否由Common Lisp中的let mutable定义?

时间:2017-01-05 19:41:23

标签: lisp common-lisp let

例如,在Common Lisp中使用此let

(let ((a 5)) (print a))

a一样defparameter是否可变,或a的{​​{1}}是defvar是不变的?

2 个答案:

答案 0 :(得分:4)

您可以更改a绑定的内容,即make 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始终将变量重新定位。

答案 1 :(得分:1)

以下是一些可能澄清这一点的例子。你可以在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有很大关系。