请在2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面了解此操作的一些更多信息。

0
Clojure

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

`
user=> (ns foo)
nil
foo=> (def inc inc)
警告:inc 已经在命名空间 foo 中引用:#'clojure.core/inc,将被替换为:#'foo/inc

'foo/inc

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

foo=> (ns bar)
nil
bar=> (require ['foo :refer ['inc]])
警告:inc 已经在命名空间 bar 中引用:#'clojure.core/inc,将被替换为:#'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尤其相关,其中已复制此内容

Tom,我查看了你的项目。感谢你。其中似乎没有类似(def inc inc)的东西。在我这里,始终在 '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相同的测试步骤中抛出异常。在data.int-map内部打印的clojure.core/update和int-map/update(在data.int-map和Tom的命名空间compiler-update-not-referenced-bug.core中)的调试打印显示,在data.int-map内部打印是正常的,在Tom的命名空间内(在不进行uberjar的情况下)也是正常的。但是,在进行uberjar和测试时,Tom的命名空间中的int-map/update未绑定。

如果这有区别的话,我的测试是在Mac OS X 10.9.5、Java 1.7.0_45 Java HotSpot(TM) 64-Bit Server VM上的Leiningen 2.5.0上进行的。

0

评论者:bronsa

Tom,我已经提出一个修补AOT问题的票据: http://dev.clojure.org/jira/browse/CLJ-1604

0

评论人:hiredman

此bug的后果可能很难追踪回这个bug。如果能在某种程度上修复它,那将非常好。

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

会在defmethod处抛出编译器错误,因为update未绑定

0

评论者:seancorfield

这看起来非常类似于我最近在Encore和Clojure 1.9.0早期Alpha版中遇到的bug。那里引入了一个新的核心谓词,导致Encore发出警告,它使用同名定义了一个函数 - 但使用代码时产生了未绑定var的错误。在那个案例中,它是在do形式内部的一系列defn形式 - 为了在一系列函数定义周围放置reader条件。我将冲突函数从do中移除,错误就没有了(但警告仍然存在,预料之中)。您可以在提交给Encore的PR中看到代码重排:https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17

将那些函数添加到:refer-clojure :exclude而不是解决此问题(并且显然使警告消失)

0
...