Какая разница между вар и цитатой? - PullRequest
14 голосов
/ 21 мая 2011

В чем смысл разницы между var и цитатой в Clojure?Например, (var a) и (quote a).

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

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

Ответы [ 2 ]

17 голосов
/ 21 мая 2011

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

(quote a)
=> a

(var a) возвращает переменную (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 является своего рода ссылкой, которая может содержать любой тип значения Clojure.Таким образом, символ идентифицирует переменную, которая содержит значение.

4 голосов
/ 21 мая 2011

Учтите это:

; #'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).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...