2024 年 Clojure 定期调查!中分享您的想法。

欢迎!请参阅 关于 页以获取有关如何使用本站的一些更多信息。

0
Clojure

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

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

'foo/inc

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

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

IllegalStateException 尝试调用未绑定的 fn: #'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,已经拷贝过去了。

Tom,看了你的项目。谢谢。看起来里面没有类似(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使用类型提示覆盖其报告的类”:上述两个天秤座命令均没有错误或警告。

下一个带有描述“添加 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 和 Tom 的命名空间 compiler-update-not-referenced-bug.core 中)的调试打印值在 data.int-map 内打印时看起来正常,当不执行 uberjar 时在 Tom 的命名空间中正常,但执行 uberjar 时在测试中 int-map/update 未绑定在 Tom 的命名空间中。

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

0

评论者:bronsa

Tom,我为修复 AOT 问题提交了一个补丁:http://dev.clojure.org/jira/browse/CLJ-1604

0

评论者:hiredman

这个问题的后果可能很难追踪到这个问题。非常希望能够以某种方式解决。

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

在 defmethod 上抛出编译错误,说 update 未绑定

0

评论者:seancorfield

这看起来非常类似于我最近在Encore和Clojure 1.9.0早期Alpha版本中遇到的一个bug。那里引入了一个新的核心谓词,造成了Encore的警告,该警告定义了一个同名函数——但使用代码时出现了无法解绑var的错误。在那个例子中,这是一个在{{do}}形式内部的一系列{{defn}}形式——这样做是为了将一个读取条件包围在一组函数定义周围。我将冲突的函数从{{do}}中移除,错误消失了(但正如预期的那样,警告仍然存在)。您可以在Encore上看到我提交的PR,其中显示了代码的重排:[https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17](https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17)

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

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