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 投票

评论者:ekoontz

由对提交ba930d95fc(master分支)执行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](https://clojure.atlassian.net/browse/CLJ-5) (由alex+import报告)
...