这里是另一个关于获得更好的赞成错误信息的投票。
下面提到的库或多或少成功地处理了症状,但让我们从一个想要学习Clojure的人的角度来看。
好的,现在我知道如何下载它。我可能试着通过使用 repl.it
去体会一下它。
现在我有了基本的经验(与 clojure.org 的混淆错误消息相比)(见: "你可能会看到的一种令人困惑的错误是意外尝试将数据列表评估为代码: " )
好吧,我们先去学习Clojure。
好的,仍然没有关于如何启动REPL的内容。
第三个链接:一个好的开始REPL的想法。
第四个链接:这里有很多启动REPL的方法。
这里有运行REPL的其他方法。
没有一项提及:如果你是初学者,请添加clj-stacktrace,然后启动REPL。
你看到为什么这不太实际了吗?
我知道你近年来投入了大量的努力来写更好的文档,我不愿意指出这些问题。在回到如此熟悉的事物的同时,以一个想了解这种新语言的开发者的视角来看,是很不容易的。
我相信你有一次或可能两次机会给人留下好的印象,生动的错误信息告诉你哪里出了错,这是其中很重要的一部分。
用户=> (map 1 inc)
不知道如何从:clojure.core$inc创建ISeq。
user=> (1 2 3)
执行错误(ClassCastException)在用户/eval7(REPL:1)。类 java.lang.Long不能转换为类 clojure.lang.IFn(java.lang.Long位于模块java.base的加载器'bootstrap'中;clojure.lang.IFn位于未命名的模块的加载器'app'中)
这两者都没有告诉我我哪里做错了。它告诉我后台如何工作的 Lisp 解算器的某些具体细节。(其中一些在 clojure.org 上有记录)。
对于我这个新用户来说,这些都没有帮助,我得去谷歌搜索。
对于初学者来说,在错误信息上进行谷歌搜索,如错误的参数顺序或调用无法调用的函数的错误, tolerance 并不是很高。
这就是让你觉得错误消息指导用户并不是很重要。
(顺便说一句,你处理(nil 2 3)得很好,并不抛出 NPE)
这就是 clojure(实现)积极贡献到“巨大学习曲线”说法的地方。
看过了这样的错误信息很多次之后,我知道了这是怎么回事。(关于Sean的评论)。
损害已经造成了。
其他 Clojure 方言在这里做得更好。(如 CLJS 和 Sci)
说到努力:有人反对说提供更好的错误消息会影响性能。如果我们在这里谈论异常处理(如上所述,我们确实在两种情况下都这样做),
我不确定我是否理解到性能影响在哪里。
当 s-expr 失败时,异常处理不在性能关键路径上,我想。
我很乐意更好地理解性能方面是如何发挥作用的。
仅仅为上面两个示例错误信息,从用户的角度而不是系统的角度编写它们的努力并不高。对于其中之一来说,意味着更改 RT.java 中的第 557 行
更好的错误信息可能意味着捕捉更底层的异常,将与当前 AST 关联,并以与生成错误的列表元素相关联的消息重新抛出。
我恳请你指导初学者获得最好的REPL。
使其成为入门和了解 Clojure 的默认设置。
然后你可以拉下帷幕说:你知道,下面是IFn和ISeq,你可能看到Java堆栈跟踪。
在Clojure的道路上,有许多新的概念需要学习和理解。重新解释错误信息不应该是其中之一。