当我检查一个符号是否可以解析时,我得到了一些奇怪的行为。
user=> ok
CompilerException java.lang.RuntimeException: Unable to resolve symbol: ok in this context, compiling:(NO_SOURCE_PATH:0)
user=> (resolve 'ok)
nil
user=> (if (resolve 'ok) "bla" (def ok 'ok))
"bla"
user=> ok
#<Unbound Unbound: #'user/ok>
user=> (def ok 'ok)
#'user/ok
user=> ok
ok谁能告诉我这可能是从哪里来的?这种行为是故意的吗?
发布于 2012-01-15 15:02:07
(def ok "whatever")在编译时创建一个名为ok的变量。编译器扫描整个表单以对其进行编译,发现您将定义一个名为ok的变量,并在实际执行表单之前为您创建它(没有绑定)。当实际执行def表单时,表达式的运行时值将被分配给变量user/ok。在您的示例中,这种情况从未发生过,因为已经创建了var,而if分支走了另一条路。
使用bound?作为替代是一个糟糕的想法,因为它测试完全不同的东西:指定的变量(必须存在)是否具有永久或线程本地的绑定。
发布于 2012-01-16 16:53:42
因为我只在宏内使用它,所以我现在按如下方式使用它
(defmacro bla [x]
(if (resolve x) x `(def ~x '~x)))现在它起作用了,因为def在引用的表单中,并在解析后计算。
https://stackoverflow.com/questions/8862325
复制相似问题