在公共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