请分享您的想法到2024年Clojure状态调查!

欢迎!请查看关于页面以了解更多关于此工作方式的信息。

0
错误

目前,特定情况下,defmulti的异常信息并不如可能的那样有帮助。用lazy seq作为派发参数调用此多方法将引发以下异常

`
(defmulti test-multi identity)
(defmethod test-multi 1 [arg] true)

(test-multi (map identity [:x]))
;=> java.lang.IllegalArgumentException: No method in multimethod 'test-multi' for dispatch value: clojure.lang.LazySeq@3c6f1187
`

有时查看正在派发 proces的lazy seq中的值将很有用。更好的错误信息可能看起来像这样
例如这个

(test-multi (map identity [:x])) ;=> java.lang.IllegalArgumentException: No method in multimethod 'test-multi' for dispatch value (:x) of class clojure.lang.LazySeq

此补丁通过使用pr-str格式化派发值并在传递给异常构造函数之前打印类来解决此问题。对MultiFn.java中抛出派发值作为异常消息一部分的方法也执行了相同的操作。

4个答案

0

评论者:bronsa

如果值是无限的lazy-seq怎么办?

0

评论者:r0man

Nicola,我忘记了这些。但我认为可以用

(set! *print-length* 10)

来处理无限序列。我会试一试,稍后更新补丁。

考虑过其他边界情况吗?

0
评论由:r0man_作出

在阅读过“控制狂奔的火车、洋葱和锻炼
LispReader.java 和 EdnReader.java 的异常消息可以更详细。
多重方法在堆栈跟踪中不包含正确的方法名称。
错误消息中的令人困惑的函数名称后缀


在编译器错误消息中使用“构造函数”而不是“ctor”


类别
所有类别


Clojure (1.5k)


语法和读取器 46
编译器 27

11
0
记录和类型 14

Java互操作 44

...