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

欢迎!有关如何使用此部分的更多信息,请参阅 关于 页面。

0 投票
错误
某些核心函数名在错误消息中报告时带有奇怪的变形后缀。

例如,当传递错误数量的参数给 {{inc}}、{{assoc}} 和 {{dissoc}} 时,每个错误消息报告的函数名都不同


clj -Srepro -Sdeps '{:deps {org.clojure/clojure {:mvn/version "1.10.0-beta4"}}}'



user=> (inc)
编译 inc 时出现语法错误 (1:1)。
传递给:clojure.core/inc--inliner--5436 的参数数量不正确(0)
user=> (assoc)
评估错误(ArityException)在 clojure.lang.AFn.throwArity (AFn.java:429)。
传递给:clojure.core/assoc--5316 的参数数量不正确(0)
user=> (dissoc)
评估错误(ArityException)在 clojure.lang.AFn.throwArity (AFn.java:429)。
传递给:clojure.core/dissoc 的参数数量不正确(0)


从用户的角度来看,这种行为没有理由且令人困惑。也许这些名称应该进一步去混淆,并以无后缀的形式打印。

2 个答案

0 投票

评论者:alexmiller

第一个在这里是一个内联函数,发生在编译过程中,所以它与其它函数略有不同。因为它被内联,所以不能进行规格化。那里的名称部分也是由编译器生成的。根据名称结构的规律性,虽然我不认为这是特别高的优先级,但这一个可能是可修复的。

一旦我们应用 CLJ-2420,后两个将会略有不同

user=> (assoc) 执行错误(ArityException)在 user$eval154/invokeStatic (REPL:1)。传递给:clojure.core/assoc--5406 的参数数量不正确(0)

user=> (dissoc) 执行错误(ArityException)在 user$eval156/invokeStatic (REPL:1)。传递给:clojure.core/dissoc 的参数数量不正确

这里所做的更改实际上是省略所有内部调用栈,并现在报告最顶层的用户调用栈(这里,它发生在 REPL 调用中,但如果它在用户命名空间中,你会看到那个而不是)。

我认为在这两种情况下,你看到的数字是 Clojure 中常用的标准技术,所以问题可能是是否有可能以系统化的方式解决这个问题。函数目前并不携带它们的未混淆名称,因此从类名称解混淆永远不会是一个万无一失的机制。

0 投票
...