请在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

此评论对ticket CLJ-1604特别相关,其中已将其复制

汤姆,我检查了你的项目。感谢你的工作。看起来它里面没有像(def inc inc)这样的东西。对我来说,'lein do clean, uberjar, test'测试步骤会持续抛出异常,但只显示警告并成功通过'lein do clean, test'。我还有更多测试结果表明在哪些Clojure版本中结果发生了变化。总结一下,以下Clojure更改似乎对结果影响最大(这些应该添加到你创建的新ticket中 —— 你可以这样做)

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上看到的异常相同。在data.int-map内部的打印显示值看起来没问题,在汤姆的命名空间中(当不进行uberjar操作时),但进行uberjar和测试时,在汤姆的命名空间中int-map/update是未绑定的。

如果这有影响,我的测试是在Mac OS X 10.9.5上使用Leiningen 2.5.0和Java 1.7.0_45 Java HotSpot(TM) 64-Bit Server VM完成的。

0

评论者:bronsa

汤姆,我已经为修复AOT问题打开了ticket:http://dev.clojure.org/jira/browse/CLJ-1604

0

评论者:hiredman

这个bug的后果可能很难追踪回来。真的希望能以一种方式修复它。

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

在defmethod上会抛出因update未绑定而产生的编译错误

0

评论者:seancorfield

这与我在近期遇到的问题非常相似,当时使用Encore和一个Clojure 1.9.0早期Alpha版本,引入了一个新的核心谓词,这导致Encore发出警告,它定义了一个具有相同名称的函数——但使用这段代码时会报出一个未定义的变量错误。在那个例子中,它是一系列在do表单内部的defn表单——这样做是为了将一个读取器条件放在一组函数定义周围。我将冲突的函数从do表单中移除后,错误就消失了(但警告仍然存在,这是预期的)。您可以在以下PR中看到我对Encore提交的代码重排:https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17

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

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