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

欢迎!请参阅 关于 页面以了解更多有关此功能的信息。

0 票数
Clojure

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

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

'foo/inc

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

foo=> (ns bar)
nil
bar=> (require ['foo :refer ['inc]])
WARNING: 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 票数
by

评论由: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使用类型提示覆盖其报告的类”:上面两个lein命令都没有错误或警告。

下一个描述为“添加clojure.core/update,像update-in但只接受单个key”的提交添加了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中的相同。在数据.int-map内部打印clojure.core/update和int-map/update(在data.int-map和Tom的命名空间compiler-update-not-referenced-bug.core中)的调试打印显示当在data.int-map内部打印时和在不进行uberjar的Tom的命名空间中一切看起来都正常,但进行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 票数
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 形式中的 {{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 报告)
...