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

由: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
by

由:ekoontz发表的评论

通过在 master 分支上使用 git diff 与提交 ba930d95fc 比较生成的补丁。

0
by

由:ekoontz发表的评论

抱歉,此补丁有误:它假设绑定左侧是错误的 - 在

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

因为 {{[x y]}} 是一个向量,而实际上左侧是正确的(按照 https://clojure.org/special_forms#let 中的描述:“Clojure 在 let 绑定列表中支持抽象结构绑定,通常称为分解”。)

所以需要检查并标记右侧(大括号)为错误,而不是 {{[x y]}}。

0
by

评论者:carinmeier

添加 patch better-error-for-let-vector-map-binding

这会生成以下结果

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

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

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

想知道是否最好尝试将映射转换为序列以支持?尽管这可能是另一个问题。

有什么想法吗?

0
by

评论者:aaron

这似乎太具体了。这是否表明存在一个更大的问题需要解决?即使这个问题是唯一一个导致错误信息不良的绑定情况,上述所有情况都应该在补丁中得到解决。

0
by

评论者:carinmeier

不幸的是,意识到这仍然没有涵盖嵌套分解的情况。得出结论,我上面提出的方法将不会适用于此。

0

评论者:carinmeier

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

支持嵌套解构错误

let [[[x1 y1][x2 y2]] [[1 2] {}]] ;=> UnsupportedOperationException let cannot destructure class clojure.lang.PersistentArrayMap.

0

评论人:hiredman

我对那个错误信息不是很满意,let可以很好地解构映射。

如果错误信息要更改,我更喜欢得到类似“序列解构不支持在映射上”的东西。

我实际上很喜欢“nth不支持”的错误信息,因为它正是问题所在,nth,由序列解构使用,在映射上不工作。

如果你知道解构是如何工作以及nth代表什么,它传达了确切的问题,而"UnsupportedOperationException let cannot destructure class clojure.lang.PersistentArrayMap"在你了解情况的时候似乎具有误导性

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