另一项Clojure状态调查以及“错误消息”仍然是改进的首要任务。
Slack上的讨论导致许多关于异常和错误消息的入门难题。我希望在此处关注的一个是为(pst)
提供一个入门友好替代品。
目前,(pst)
在尽可能清晰地显示堆栈跟踪方面做出了合理尝试,消除了“噪音”,并缩减了一些堆栈跟踪——但它对于入门者来说仍然不够理想,这些入门者在理解某些异常以及导航(Java风格)堆栈跟踪方面有困难,尤其是与其他一些努力提供用户友好错误消息和堆栈跟踪的语言相比。
Slack中的一个例子是
(defn f [i]
(fn [j]
(/ j i)))
(run! #(% 1) (map f (range 3)))
REPL中打印的异常没问题,但显示了
user=> (pst)
ArithmeticException Divide by zero
clojure.lang.Numbers.divide (Numbers.java:190)
user/f/fn--16571 (NO_SOURCE_FILE:3)
user/eval16576/fn--16577 (NO_SOURCE_FILE:1)
clojure.core/run!/fn--8906 (core.clj:7849)
...
省略的部分提到了clojure.lang.ArrayChunk.reduce
,然后对clojure.core.protocols
的内容有多次引用(并且默认没有足够深入地显示clojure.core/run!
的原始调用)。
我认为这里有机会创建一个新的clojure.repl/explain
函数,它接受与pst
相同的参数,提供对失败情况的更详细说明,同时进一步减少pst
目前显示的堆栈跟踪中的噪音。
理想的情况下,可以通过对核心进行一些基本清理来实现这一点,但有一些动态钩子,允许其他工具“安装”额外的扩展和/或清理,以便社区可以提供库和功能,进一步改善初学者的体验。
例如,一个动态钩子到ex-str
,将允许社区提供的工具对显示的异常消息进行按摩(对于原始REPL输入以及对和explain
),以便将入门者难以理解的消息(如class <whatever>不能被转换为clojure.lang.IFn...
)改写成入门友好语言的(如期望函数-找到 <whatever>
)。
类似的功能会将堆栈帧过滤到字符串中,从而使输出对初学者更友好。