5

(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
4

1 回答 1

10

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
于 2012-08-09T17:22:35.840 回答