Определяется ли переменная let mutable в Common Lisp?
В, например, это let
в Common Lisp
(let ((a 5)) (print a))
Является a
изменчивый как с defparameter
или a
постоянная, как в случае с defvar
?
2 ответа
Вы можете изменить то, что 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
,