Какая разница между var и quote?

Какая разница значений между var и quote в Clojure? Например, (var a) и (quote a).

Официальный сайт имеет следующие документы, но какова разница в объекте var и значении для символа? Я смущен.

(символ var) Символ должен быть разрешен для var, и сам объект Var (а не его значение) возвращается

Ответы

Ответ 1

(quote a) возвращает символ (clojure.lang.Symbol) - он фактически делает то же самое, что и 'a. Стоит прочитать немного больше о Clojure читателе, чтобы узнать немного больше о символах. Пример:

(quote a)
=> a

(var a) возвращает var (clojure.lang.Var), представленный символом a в текущем пространстве имен. Вы получите сообщение об ошибке, если a не определено в текущем пространстве имен. Пример:

(var a)
=> #<CompilerException java.lang.RuntimeException: Unable to resolve var: a in this context, compiling:(NO_SOURCE_PATH:1)>

(def a 1)
(var a)
=> #'user/a

Это техническое определение - но здесь интуиция за ним: символ - это имя, которое можно использовать для поиска var в заданном пространстве имен. Сам var является своего рода ссылкой, которая может содержать любое значение Clojure. Таким образом, символ идентифицирует var, который содержит значение.

Ответ 2

Рассмотрим это:

; #'x a reader short-cut for (var x), and 'x is a short-cut for (quote x)
(def x)
(binding [x 1] (var-set #'x 2) (list (var x) (quote x) x)) 

Что оценивает что-то вроде (добавленные комментарии)

(
 #'sandbox177857/x ; the variable itself - was passed to var-set
 x                 ; the symbol x. same as 'x
 2                 ; last value in #'x
)

set! возьмет (помимо прочего) Var или символ, который разрешает глобальное имя (var-set будет принимать только Var). Причина, по которой (var-set x ...) не сработала, заключается в том, что это привело бы к тому, что значение x передавалось (а не Var, называемое x).

Надеюсь, это помогло. Счастливое кодирование.