请在2024 年 Clojure 情况调查!分享您的想法。

欢迎!请参阅关于页面以获取更多有关此如何工作的信息。

0
错误

以下损坏的代码

(let [[x y] {}] x)

提供以下堆栈跟踪

`
异常发生在 "main" 线程中 java.lang.UnsupportedOperationException: nth 不支持此类型:PersistentArrayMap (test.clj:0)

    at clojure.lang.Compiler.eval(Compiler.java:4543)
    at clojure.lang.Compiler.load(Compiler.java:4857)
    at clojure.lang.Compiler.loadFile(Compiler.java:4824)
    at clojure.main$load_script__5833.invoke(main.clj:206)
    at clojure.main$script_opt__5864.invoke(main.clj:258)
    at clojure.main$main__5888.doInvoke(main.clj:333)
    at clojure.lang.RestFn.invoke(RestFn.java:413)
    at clojure.lang.Var.invoke(Var.java:346)
    at clojure.lang.AFn.applyToHelper(AFn.java:173)
    at clojure.lang.Var.applyTo(Var.java:463)
    at clojure.main.main(main.java:39)

原因:java.lang.UnsupportedOperationException: nth 不支持此类型:PersistentArrayMap

    at clojure.lang.RT.nth(RT.java:800)
    at clojure.core$nth__3578.invoke(core.clj:873)
    at user$eval__1.invoke(test.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:4532)
    ... 10 more

`

"nth 不支持此类型" 的信息虽然正确,但并没有使得错误原因很清楚。当解构时更好的错误信息会有很大帮助。

10 个答案

0
0

评论者:ekoontz

请参阅以下附加补丁,该补丁产生了一个更清晰的错误信息,如下所示(给出原始错误报告中的损坏代码)

Clojure 1.4.0-master-SNAPSHOT user=> (let [x 42 y 43] (+ x y)) 85 user=> (let [[x y] {}] x) UnsupportedOperationException 左侧的绑定必须是一个符号(找到一个 PersistentVector)。 clojure.lang.Compiler.checkLet (Compiler.java:6545) user=>

此外,此补丁还检查了 (let) 的参数,如下所示

user=> (let 42) UnsupportedOperationException (let) 的参数必须是一个向量(找到一个 Long)。 clojure.lang.Compiler.checkLet (Compiler.java:6553)

0

评论者:ekoontz

通过在 master 分支中与提交 ba930d95fc 进行 git diff 生成的补丁。

0

评论者:ekoontz

抱歉,这个补丁是错误的:它假设绑定左侧是错误的 -

因为在

(let [[x y] {}] x)

{{[x y]}} 是一个向量,但实际上,左侧是正确的(参见 https://clojure.org/special_forms#let : "Clojure 在 let 绑定列表中支持抽象的结构绑定,通常称为解构")。

因此,需要检查并标记为错误的右侧({)而不是 {{[x y]}}。

0

留言者:carinmeier

添加补丁 better-error-for-let-vector-map-binding

这将产生以下结果

(let [[x y] {}] x) 异常:不支持向量的映射绑定

但还存在其他未处理的案例 --- 例如将向量绑定到集合

user=> (let [[x y] #{}] x) UnsupportedOperationException nth不支持此类型:PersistentHashSet

想知道是否尝试将其转换为序列以支持更好?虽然这可能是另一个问题。

看法如何?

0

留言者:aaron

这似乎过于具体。这是否表明应该解决更大的问题?即使是唯一导致产生不良错误信息的绑定案例,上述所有案例都应在补丁中得到处理。

0

留言者:carinmeier

不幸的是,意识到这仍然覆盖不了嵌套解构的情况。得出结论,我上述的方法对此不可行。

0

留言者:carinmeier

文件:clj-5-destructure-error.diff

添加了对嵌套解构错误的支持

let [[[x1 y1][x2 y2]] [[1 2] {}]] ;=> UnsupportedOperationException let无法解构类clojure.lang.PersistentArrayMap。

0

评论者:hiredman

我并不喜欢这个错误消息,let可以很好地解构一个map。

如果错误消息要改变,我更喜欢得到类似于“顺序解构不支持在map上”的消息。

我真的喜欢“nth不支持”的错误消息,因为它正是问题所在,nth,用于顺序解构,在map上不起作用。

如果你知道如何解构以及nth的含义,它确实传达了问题是什么,而“UnsupportedOperationException let cannot destructure class clojure.lang.PersistentArrayMap”似乎是在误导你

0
参考:https://clojure.atlassian.net/browse/CLJ-5 (由 alex+import 报告)
...