clojure2024调查中分享您的想法!

欢迎!请查看关于页面以获取更多信息。

0
错误

以下损坏的代码

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

提供以下堆栈跟踪

`
Exception in thread "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 left side of binding must be a symbol (found a PersistentVector instead). clojure.lang.Compiler.checkLet (Compiler.java:6545) user=>

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

user=> (let 42) UnsupportedOperationException argument to (let) must be a vector (found a Long instead). clojure.lang_COMPILER.checkLet (Compiler.java:6553)

0

评论人:ekoontz

通过将 git diff 与提交 ba930d95fc(master 分支)进行比较来产生的补丁。

0

评论人:ekoontz

抱歉,这个补丁是错误的:它假定绑定的左侧是错误的 - 中的 {{[x y]}}

(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报告)
...