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 (またはクラス) を検索し、実行時に動作します。varvar を返すだけで、コンパイル時に動作します。(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 に答える