这又是为“开箱即用”的更好错误消息投了一个支持票。
以下提到的库更多或更少地成功处理了症状,但让我们从想要学习Clojure的人的角度来看,因此他们访问Clojure.org,点击“入门”。
好了,我现在知道了如何下载它。也许我会通过使用repl.it
来尝试感受它。
现在我有了一个基本的经验(根据clojure.org令人困惑的错误消息),(参见:“你可能看到的一个错误示例是意外地将数据列表当作代码来评估:” )
嗯,让我们先学习Clojure。
好了,关于如何启动REPL,仍然什么都没有。
第三个链接:启动REPL是一个好主意。
第四个链接:这里有n种启动REPL的方法。
这里有其他运行REPL的方法。
没有任何提到:如果你是初学者,让我们添加clj-stacktrace,然后启动一个REPL。
你为什么觉得这是不切实际的?
我知道您近年来为了编写更好的文档付出了很多努力,我感到很难指出这些问题。返回到一个如此熟悉的东西,并用一个想了解这种新语言的开发者的视角去看待它,是很困难的。
我相信您只有1次或最多2次机会留下好印象,而清晰易懂的错误信息,告诉您哪里出错,这是其中重要的一部分。
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 的道路上,有许多新概念需要学习和理解。重新解释错误信息不应该成为其中之一。