Clojure绑定无法工作

3

我正在学习 Stuart Halloway 的《Clojure 编程》一书中的 Clojure 示例,但在使用 binding 函数时遇到了问题:

(def foo 10)
; => '#user/foo

foo
; => 10

(binding [foo 42] foo)
; => 10

(binding [user/foo 42] foo)
; => 10

(binding [user/foo 42] (var-get #'user/foo))
; => 10

为什么它不会给我42?

在第二行,似乎有两个字符被交换了。 - Svante
1
你使用的是哪个IDE/环境?Clojure的版本是多少?你的代码在我的电脑上运行良好,我使用的是最新的git版本Clojure,并从命令行运行。 - Brian Carper
Clojure-1.1.0-alpha-SNAPSHOT在Snow Leopard上...我刚刚在我的Windows PC上尝试了1.0.0版本,它运行良好,所以这一定是那个版本的一个错误。有趣的是,书的作者建议您使用捆绑版本的Clojure,因为他在其中测试了所有示例...然后它在该示例中不起作用。 - cdmckay
在Linux/1.1.0-alpha上表现相同,请在http://groups.google.com/group/clojure上询问此事。 - DigitalRoss
2个回答

3

结论:有 bug

在版本为 1.1.0-alpha-SNAPSHOT 中出现了问题,而且在 Linux 上也可以重现。

如果现在返回 Clojure 的下载页面,那个版本似乎已经被撤回了,1.0.0 是“推荐”的下载版本。

在 1.0.0 版本中,您的示例确实绑定了 42。


1

另外一件事情是:
当你在另一个线程中运行代码时,很容易被绑定所困扰。我曾经遇到过这样的问题,当我调用一个函数时,它通过pmap而不是map来评估某些东西,而实际上该代码是在线程池中的线程上执行的。我相信代理也会这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接