Common Lisp 中 let 定义的变量是否可变?
Is the variable defined by a let mutable in Common Lisp?
例如 Common Lisp 中的 let
(let ((a 5)) (print a))
a
是否与 defparameter
一样可变,或者 a
是否与 defvar
一样不变?
您可以更改 a
绑定的内容,即让 a
引用其他内容:
(let ((a 5)) (setf a 10))
如果 a
引用的值是可变的,你可以改变它:
(let ((a (list 5))) (setf (first a) 10))
Is a mutable as with defparameter, or is a constant as is the case with 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
.
关系更大
例如 Common Lisp 中的 let
(let ((a 5)) (print a))
a
是否与 defparameter
一样可变,或者 a
是否与 defvar
一样不变?
您可以更改 a
绑定的内容,即让 a
引用其他内容:
(let ((a 5)) (setf a 10))
如果 a
引用的值是可变的,你可以改变它:
(let ((a (list 5))) (setf (first a) 10))
Is a mutable as with defparameter, or is a constant as is the case with 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
.