首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure: resolve声明符号

Clojure: resolve声明符号
EN

Stack Overflow用户
提问于 2012-01-14 20:51:22
回答 2查看 1.3K关注 0票数 7

当我检查一个符号是否可以解析时,我得到了一些奇怪的行为。

代码语言:javascript
复制
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

谁能告诉我这可能是从哪里来的?这种行为是故意的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-15 15:02:07

(def ok "whatever")在编译时创建一个名为ok的变量。编译器扫描整个表单以对其进行编译,发现您将定义一个名为ok的变量,并在实际执行表单之前为您创建它(没有绑定)。当实际执行def表单时,表达式的运行时值将被分配给变量user/ok。在您的示例中,这种情况从未发生过,因为已经创建了var,而if分支走了另一条路。

使用bound?作为替代是一个糟糕的想法,因为它测试完全不同的东西:指定的变量(必须存在)是否具有永久或线程本地的绑定。

票数 4
EN

Stack Overflow用户

发布于 2012-01-16 16:53:42

因为我只在宏内使用它,所以我现在按如下方式使用它

代码语言:javascript
复制
(defmacro bla [x]
    (if (resolve x) x `(def ~x '~x)))

现在它起作用了,因为def在引用的表单中,并在解析后计算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8862325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档