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

欢迎!请参阅 关于 页面获取更多关于此如何运行的信息。

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 无法解构 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 报告)
...