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)这样的内容。在我的测试步骤'lein do clean, uberjar, test'中始终抛出异常,但只有警告信息没有错误,并且'lein do clean, test'测试通过。我有更多的测试结果显示这些结果在不同版本的Clojure中是如何变化的。为了总结,让Clojure的结果变化最大的改动如下(这些应该添加到你创建的新工单中——你可以这样做)

Clojure 1.6.0, 1.7.0-alpha1,以及之后的改动,直至"CLJ-1378: Allows FnExpr to override its reported class with a type hint"的提交:上方两个lei命令没有任何错误或警告。

下一个带有描述"Add clojure.core/update, like update-in but takes a single key"的提交添加了clojure.core/update:'lein do clean, test'可以正常运行,但'lein do clean, uberjar'在编译过程中抛出异常,可能是由于CLJ-1241。

下一个带有描述"fix 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中和在汤姆的名字空间compiler-update-not-referenced-bug.core中)的调试输出显示,在data.int-map内部打印时看起来一切正常,在汤姆的名字空间内部打印时没有得到uberjar,但在生成uberjar时,test, int-map/update在汤姆的名字空间中不绑定。

如果这很重要,我的测试是在macOS X 10.9.5、Java 1.7.0_45的Java HotSpot(TM) 64位服务器虚拟机上进行的。

0

评论者:bronsa

汤姆,我已经创建了一个修复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

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

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