В, например, это let
в Common LispЯвляется ли переменная определенной переменной let изменяемой в Common Lisp?
(let ((a 5)) (print a))
Является a
изменчивый, как с defparameter
, или a
постоянной, как в случае с defvar
?
В, например, это let
в Common LispЯвляется ли переменная определенной переменной let изменяемой в 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?
No, DEFVAR
не определяет константы.
(defvar *var* :value)
(setf *var* 5)
Тогда:
*var*
=> 5
Что происходит, что когда вы оцениваете DEFVAR
форму, он сначала проверяет, является ли символ уже привязан. Если это так, то существующее значение сохраняется. С другой стороны, DEFPARAMETER
всегда переопределяет переменную.
Вот несколько примеров, которые могут прояснить это. Вы можете попробовать их в реплике. Попытайтесь думать о том, являются ли они больше похожи 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
.
Константы создаются с помощью 'DEFCONSTANT', а не' DEFVAR'. – Barmar