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

欢迎!有关此功能的一些更多信息,请查看 关于 页面。

0
错误

以下错误代码

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

产生以下堆栈跟踪

`
异常线程 "main" java.lang.UnsupportedOperationException: nth not supported on this type: 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 not supported on this type: 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 not supported on this type" 是正确的,但它没有使错误原因更加明确。在解构时提供更好的错误信息将非常有帮助。

10 个答案

0

评论者:importer

http://www.assembla.com/spaces/clojure/tickets/5 转换而来

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

该补丁是通过将git diff与提交ba930d95fc(master分支)进行比较而生成的。

0

评论者:ekoontz

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

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

因为在

事实上,左侧是正确的(参见 https://clojure.org/special_forms#let : “Clojure在let绑定列表中支持抽象结构绑定,通常称为解构”。

0

评论者:carinmeier

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

这会产生以下结果

(let [[x y] {}] x) 异常:将map绑定到向量的操作不受支持

尽管如此,还有其他情况没有被这个处理——例如将向量绑定到集合

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

在想,是否应该尝试将map转换为seq来支持?尽管这可能是另一个问题。

有什么看法?

0

评论者:aaron

这似乎太具体了。这是否意味着还有其他更大的问题需要解决?即使这是绑定产生错误信息的唯一情况,上述所有情况都应该在patch中解决。

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无法解构类型clojure.lang.PersistentArrayMap"当你有深入了解时似乎具有误导性

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