2017-01-05 2 views

ответ

4

Вы можете изменить то, что 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 всегда переопределяет переменную.

0

Вот несколько примеров, которые могут прояснить это. Вы можете попробовать их в реплике. Попытайтесь думать о том, являются ли они больше похожи 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.

Смежные вопросы