在公共Lisp中,let定义的变量是可变的吗?
例如,在中,此在公共Lisp中,let定义的变量是可变的吗?,lisp,common-lisp,let,Lisp,Common Lisp,Let,例如,在中,此letIn Common Lisp (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)) 是可变的,就像defparameter一样,还是常量,就像defvar一样 不,不定义常量 (d
let
In Common Lisp
(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))
是可变的,就像defparameter一样,还是常量,就像defvar一样
不,不定义常量
(defvar *var* :value)
(setf *var* 5)
然后:
当您计算
DEFVAR
表单时,它首先检查符号是否已绑定。如果是这种情况,则现有值将保持不变。另一方面,DEFPARAMETER
总是重新初始化变量。您可以更改a
绑定的内容,即使a
引用其他内容:
(let ((a 5)) (setf a 10))
如果a
引用的值是可变的,则可以对其进行变异:
(let ((a (list 5))) (setf (first a) 10))
是可变的,就像defparameter一样,还是常量,就像defvar一样
不,不定义常量
(defvar *var* :value)
(setf *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
关系更大。下面的一些示例可能会澄清这一点。你可以在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
有更多关系。常量是使用defcontent
创建的,而不是DEFVAR
。常量是使用defcontent
创建的,而不是DEFVAR
。