Определяется ли переменная 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,

Другие вопросы по тегам