我有两个有些相关的问题,如下所示:
user=> (if (symbol? 5) (meta (var 5)) 5)
CompilerException java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:6)
user=> (defn dometa [x] (if (symbol? x) (meta (var x)) x))
CompilerException java.lang.RuntimeException: Unable to resolve var: x in this context, compiling:(NO_SOURCE_PATH:7)
user=>
在第一种情况下,由于5不是符号,我不期望(meta (var 5))
被评估,但它是(或者至少就像我看来的那样)。
在第二种情况下,如果我想将第一个表达式放在一个函数中,并对要测试的值进行参数化,那么(var ...)函数将不再有效。
答案 0 :(得分:1)
Var对象是looked up at compile time。对于我在您的示例中推断的行为,您应该使用find-var
。
user=> (if (symbol? 5) (meta (find-var 5)) 5) 5 user=> (defn dometa [x] (if (symbol? x) (meta (find-var x)) x)) #'user/dometa