Dom*_*k G 7 symbols clojure declare resolve
检查符号是否可以解析时,我会遇到一些奇怪的行为.
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
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这可能来自哪里?这种行为是有意的吗?
(def ok "whatever")创建一个ok 在编译时命名的变量。编译器扫描整个表单来编译它,发现您将定义一个名为 的 var ok,并在您的表单实际执行之前为您创建它(没有绑定)。当def表单实际执行时,表达式的运行时值将被分配给 var user/ok。在您的示例中,这种情况永远不会发生,因为 var 已经创建,而if分支则相反。
使用bound?作为替代品是一个糟糕的主意,因为它测试的是完全不同的东西:命名的 var (必须存在)是否具有绑定,无论是永久的还是线程本地的。