2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面以了解更多关于该如何工作的信息。

0
Clojure

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

`
user=> (ns foo)
nil
foo=> (def inc inc)
警告:inc已经在namespace: foo中指向#'clojure.core/inc,正在被替换为#'foo/inc

'foo/inc

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

foo=> (ns bar)
nil
bar=> (require ['foo :refer ['inc]])
警告:inc已经在namespace: bar中指向#'clojure.core/inc,正在被替换为#'foo/inc
nil
bar=> (inc 8)

IllegalStateException 尝试调用未绑定的函数:"#'foo/inc",at 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) 不出现错误当使用 require 引入 foo/inc
c) bar/inc 应被绑定到 foo/inc

22 个答案

0

评论者:jafingerhut

Tom:Alex Miller或另一位审阅人员将最好说明是否应该将AOT问题作为一个单独的问题,但我的最好猜测是“试试吧”。我试图查看你提供的链接,但它似乎没有指向任何地方。你能再核实一下这个链接吗?

0

评论者:tcrayford

Andy,

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

0
by

评论者: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使用类型提示覆盖其报告的类"的提交:对于上述任何 Leiningen 命令都没有错误或警告。

下一个带有描述"添加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内部打印时一切看起来都不错,在Tom的命名空间中(不在uberjar情况下),但是当进行uberjar测试时,int-map/update在Tom的命名空间中未绑定。

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

0
by

评论者:bronsa

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

0
by

评论者:hiredman

这个bug的后果可能很难追踪到这个bug。如果能解决这个问题就太好了。

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

在defmethod上会抛出一个编译错误,因为update是未绑定的

0

评论人:seancorfield

这与我在Encore和Clojure 1.9.0早期Alpha版本中遇到的bug非常相似。那里引入了一个新的核心谓词,导致Encore发出警告,定义了一个具有相同名称的函数 -- 但使用代码时产生了未绑定var的错误。在这种情况下,它是一系列在do-form内部的defn形式 -- 用于将reader条件包围在函数定义组周围。我将冲突函数从do-form中提取出来,错误消失了(但如预期的那样,警告仍然存在)。您可以在Encore提供的PR中看到代码重排:[https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17](https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17)

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

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