Clojure:resolve和var有什么区别?

6
什么是(resolve...)(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个回答

10

resolve 在运行时查找给定符号(变量或类),并执行。 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

1
谢谢,那么我什么时候使用其中一个而不是另一个呢? - Sonicsmooth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接