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

评论由:导入器发表

从: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投票
by

评论者:hiredman

我对这个错误信息并不热衷,let可以很好地解构map。

如果错误信息要改变,我更喜欢得到“在map上不支持序列解构”这样的信息。

我实际上喜欢“nth不支持”的错误信息,因为它正是问题的所在,nth,用于序列解构的功能,在map上不工作。

如果你知道解构的工作方式和nth的意思,这就能准确地传达问题所在,而从“UnsupportedOperationException let cannot destructure class clojure.lang.PersistentArrayMap”来看似乎具有误导性,当你知道时

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