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

欢迎!请查看关于页面以了解更多有关如何使用本站的信息。

0
Clojure

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

`
user=> (ns foo)
nil
foo=> (def inc inc)
WARNING: inc already refers to: #'clojure.core/inc in namespace: foo, being replaced by: #'foo/inc

'foo/inc

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

foo=> (ns bar)
nil
bar=> (require ['foo :refer ['inc]])
WARNING: inc already refers to: #'clojure.core/inc in namespace: bar, being replaced by: #'foo/inc
nil
bar=> (inc 8)

IllegalStateException Attempting to call unbound 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

这条评论与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中看到的一样。clojure.core/update和int-map/update(在data.int-map和Tom的namespace compiler-update-not-referenced-bug.core中)的调试打印显示,在data.int-map中打印时看起来正常,在Tom的namespace中没有进行uberjar时也是如此,但在进行uberjar时,Tom的namespace中的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

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

0

评论者:hiredman

这个bug的后果可能非常难以跟踪到这个bug。能与这个bug修复将非常美好。

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

在defmethod中将抛出更新未声明的编译器错误

0
by

评论由:seancorfield

这看起来非常像我在Encore和Clojure 1.9.0早期Alpha版本中遇到的那个bug,当时引入了一个新的核心谓词,导致Encore发出警告,因为它定义了一个同名函数--但使用该代码会产生一个不可绑定而这个变量的错误。在这种情况下,它是一个在{{do}}表中的{{defn}}表序列--这样做是为了围绕一组函数定义添加一个读取条件。我将冲突函数从{{do}}中移除,错误消失了(但如预期的那样,警告仍然存在)。您可以看到我提交给Encore的PR,其中展示了代码重排:https://github.com/ptaoussanis/encore/pull/26/commits/040bf1be99eee79cbbcb7cc10ed37aa0a1e7ec17

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

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