2024 Clojure调查!中分享您的看法。

欢迎!有关本工作的更多信息,请参阅关于页面。

0
Clojure

以下代码失败(在1.6和最新1.7-alpha4中均如此)

`
user=> (ns foo)
nil
foo=> (def inc inc)
WARNING: inc 已经指向: #'clojure.core/inc 在命名空间:foo,将被替换为: #'foo/inc

'foo/inc

;; 注意,此时inc未绑定,这导致以下异常
foo=> inc

foo=> (ns bar)
nil
bar=> (require ['foo :refer ['inc]])
WARNING: inc 已经指向: #'clojure.core/inc 在命名空间:bar,将被替换为: #'foo/inc
nil
bar=> (inc 8)

IllegalStateException 尝试调用未绑定的函数:#'foo/inc clojure.lang.Var$Unbound.throwArity (Var.java:43)
`

进一步调查表明 foo/inc 是未绑定的

foo/inc
=> #

进一步调查还表明,将 (def inc inc) 替换为任何其他东西,例如 (def inc dec),(def inc clojure.core/inc),或 (def inc (fn (link: n) (+ n 1))) 不会引发异常(但警告仍然存在)。

我预计
a)foo/inc 应被绑定并具有与 clojure.core/inc 相同的值
b) 在引入 foo/inc 时没有错误
c) bar/inc 应绑定到 foo/inc

22 答案

0

评论者:jafingerhut

Tom:Alex Miller或另一位筛选人员应该最好说明AOT问题是否应该是一个单独的问题,但我的最好猜测是“尝试吧”。我试图查看您给出的链接,但似乎没有指向任何内容。您可以再次检查链接吗?

0

评论者:tcrayford

Andy,

好的。我会在明天某个时候写的一份。我意外地将那个仓库设为私有,现在应该可以看到了。

0

评论者:jafingerhut

这条评论对于工单CLJ-1604尤其相关,其中已经复制了这条评论

汤姆,我看了看你的项目。谢谢你。看起来它里面没有像(def inc inc)这样的东西。在我这边,总是会在'test'步骤中抛出异常,在'lein do clean, uberjar, test'中也是如此,但仅仅是编译警告,'lein do clean, test'通过测试。我还有更多的测试结果,显示这些结果如何随着Clojure版本的变化而变化。为了总结,对于结果影响最大的Clojure修改如下(这些应该添加到你创建的新工单中——你欢迎这样做)

Clojure 1.6.0, 1.7.0-alpha1以及之后的变更直到描述为"CLJ-1378: 允许FnExpr使用类型提示覆盖其报告的类"的提交:对于上面提到的任何一个lein命令都没有错误或警告。

下一个描述为"添加clojure.core/update,类似于update-in,但仅接受单个键"的提交添加了clojure.core/update:'lein do clean, test'正常运行,但'lein do clean, uberjar'在编译过程中抛出异常,可能由于CLJ-1241。

下一个描述为"修复CLJ-1241"的提交:'lein do clean, test'和'lein do clean, uberjar'会警告clojure.core/update,但没有错误或异常。'lein do clean, uberjar, test'在测试步骤中抛出异常,与我看到的Clojure 1.7.0-alpha4中的相同。clojure.core/update和int-map/update(在data.int-map和汤姆的命名空间compiler-update-not-referenced-bug.core中)的调试打印显示,在data.int-map内部打印时一切正常,在汤姆的命名空间中在没有做uberjar的情况下也是如此,但在做uberjar和测试时,int-map/update在汤姆的命名空间中未绑定。

如果这会影响结果,我的测试是在Mac OS X 10.9.5上进行的,使用了Java 1.7.0_45 HotSpot 64位服务器虚拟机上的Leiningen 2.5.0。

0

评论者:bronsa

汤姆,我已经打开了一个包含修复AOT(Ahead-of-Time compilation)问题的补丁的工单:http://dev.clojure.org/jira/browse/CLJ-1604

0

评论者:hiredman

这个错误的后果可能很难追踪回这个错误。如果能够以某种方式修复它将非常棒。

(defmulti update identity) ... 其他代码页 ... (defmethod update :foo [_])

将抛出称为update未绑定的编译器错误

0

评论由:seancorfield发表

这看起来和我在最近使用Encore和Clojure 1.9.0早期版本时遇到的错误非常相似,那里引入了一个新的核心谓词,导致Encore发出警告,定义了一个同名的函数——但代码的使用导致了一个错误,表明var未绑定。在这种情况下,是一个{{do}}形式内部的多个{{defn}}形式——这样做是为了在一系列函数定义周围放置读取条件。我把冲突的函数从{{do}}中提取出来,错误消失了(但正如预期的那样,警告仍然存在)。您可以在Encore中查看我提交的代码重排PR: https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17

将这些函数添加到{{:refer-clojure :exclude}}中可以“正确”解决问题(并且显然使警告消失)。

0
参考: https://clojure.atlassian.net/browse/CLJ-1591(由mikera报告)
...