另一项Clojure状态调查和“错误消息”仍然是改进的首要任务。
Slack上的讨论导致了许多关于异常和错误消息的特定痛点。我想在这里关注的是提供一个针对(pst)的入门友好型替代方案。
目前,(pst)在去除名字、消除“噪音”和缩小栈轨迹方面做出了合理的尝试,但对那些在理解某些异常和阅读(Java风格的)栈轨迹方面有困难的初学者来说,仍有很大的改进空间,特别是与其他努力提供用户友好错误消息和栈轨迹的语言相比。
Slack中的一个示例
(defn f [i]
(fn [j]
(/ j i)))
(run! #(% 1) (map f (range 3)))
REPL中打印的异常没问题,但(pst)显示了
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输入还是pst和explain),将初学者难以理解的消息(如class < whatever> cannot be cast to clojure.lang.IFn...)改写成入门友好型的语言(Expected a function - found a < whatever>)。
类似的动态钩子用于过滤栈帧,以及将它们打印为字符串,将使输出对初学者更加友好。