Какая разница между 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).
Надеюсь, это помогло. Счастливое кодирование.