行为

2011-10-23 26 views
0

我有两个有点关系的问题,通过以下所示:行为

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

'var'不是函数,它是一种特殊的形式。 – mtyaka

回答

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 
+0

您可能需要'resolve',而不是'find-var'。我以前从来没有听说过'find-var',但它看起来像是'resolve'的低级版本。 – amalloy