Clojure:resolve和var之间有什么区别?

时间:2012-08-09 16:28:05

标签: clojure symbols var

(resolve...)(var...)之间有什么区别?它们都采用符号并返回命名空间中的var。看起来resolve是一个函数,它将引用语法作为参数,var是一个特殊的形式,它采用在repl中键入的文字符号,但我不明白这些符号的使用方式不同。

user> (def my-symbol 2.71828182846)
#'user/my-symbol
user> (resolve 'my-symbol)
#'user/my-symbol
user> (type (resolve 'my-symbol))
clojure.lang.Var
user> (var my-symbol)
#'user/my-symbol
user> (type (var my-symbol))
clojure.lang.Var
user> (= (resolve 'my-symbol) (var my-symbol))
true

1 个答案:

答案 0 :(得分:9)

resolve在给定符号的情况下查找var(或类),并在运行时运行。 var只返回一个var并在编译时运行。 (var foo)#'foo

同义
(def foo "bar")
=> #'user/foo

(let [sym 'foo]
  (resolve sym))
=> #'user/foo

(let [sym 'foo]
  (var sym)) ;same as typing #'sym - doesn't actually refer to the sym local
=> Exception: Unable to resolve var: sym in this context