这是另一个对默认情况下输出更好错误消息的肯定。
下面提到的库对症状的治理大致成功,但让我们从想要学习Clojure的人的角度来看这个问题,所以他们前往 Clojure.org,点击“入门”。
现在我知道如何下载它了。也许我会尝试使用 repl.it
亲身体验。
现在我有了一个基本的体验(带着 clojure.org 上令人生厌的错误消息)(参见:"你可能看到的一个混淆的错误是由于不小心尝试将数据列表当作代码来评估:")
好吧,让我们先学习 Clojure。
好的,关于如何启动 REPL 的信息依旧没有。
第三个链接:启动 REPL 是一个好主意。
第四个链接:这里有启动 REPL 的 n种方法。
这里有其他运行 REPL 的方法。
没有任何提及:如果你是初学者,让我们添加clj-stacktrace,然后开始一个REPL。
你为什么觉得这样做不切实际?
我知道你近年来投入了大量精力来改进文档,我为此感到难过。回到如此熟悉的事物并从一个想要了解这种新语言的开发者的角度观察它,是很难的。
我相信你有一次或两次机会给人留下好印象,可读性的错误消息告诉你哪里出错了,这在其中占重要一部分。
user=> (map 1 inc)
不知道如何从:clojure.core$inc创建ISeq。
user=> (1 2 3)
执行错误(ClassCastException),在user/eval7(REPL:1)。类java.lang.Long无法转换到类clojure.lang.IFn(java.lang.Long属于模块java.base的加载器'bootstrap';clojure.lang.IFn属于未知模块的加载器'app')。
两者都没有告诉我我做错了什么。它告诉我一些关于Lisp评估器如何幕后工作的具体细节。(其中一些已在clojure.org上记录)。
由于这些对新手用户如我来说都没有帮助,所以我将在谷歌上搜索它。
对于初学者来说,谷歌错误消息的容忍度(如错误的参数顺序或调用不能调用的操作)不高。
这就是你觉得用户引导的错误消息并不重要的地方。
(顺便说一下,你处理(nil 2 3)相当好,并没引发NPE)
这就是Clojure(该实现)积极参与“巨大的学习曲线”迷思的地方。
我已经看了很多遍了,所以我明白了这是怎么回事。(关于Sean的评论)。
伤害已经造成了。
其他Clojure方言在这方面做得更好。(例如CLJS和Sci)。
说到努力,有人反对说提供更好的错误消息会影响性能。如果我们在这里谈论异常处理(以上两种情况都是如此),
我不确定我理解到性能影响在哪里。
由于s-expr失败而进行的异常处理不应在性能关键路径上。
我很乐意更好地理解性能方面是如何显现的。
此外,仅针对上述两个示例错误消息,用户视角下它们的编写工作量并不大。其中一个意味着更改RT.java的第557行
更好的错误消息可能意味着捕获底层的异常,将它们与当前的AST关联,并用与生成错误的消息关联的列表元素重新抛出。
我恳请您引导初学者达到他们能得到的最好的REPL。
使它在入门和学会Clojure的时候成为默认。
然后你可以拉回窗帘说:你知道,下面是IFn和ISeq,你可能看到Java堆栈跟踪。
在Clojure的道路上,有很多新的概念需要学习和理解。重新解释错误消息不应该是其中之一。