这里至少有两个,可能更多,不同的问题/想法,将它们分开会更恰当。前缀/钩子想法似乎是正交的。
严肃的问题——如果错误消息是好的(你说它是这里的),而且工具从未显示堆栈跟踪,为什么这是一个初学者问题?错误消息尝试显示源错误(考虑到宏的约束)的合理位置。
“初学者友好”这个框架可能并不恰当,因为这与问题无关。如果堆栈跟踪更加明确,那么它将对初学者和非初学者都很有用,并且具体列出理解堆栈跟踪的挑战将帮助到我们。不假思索...
- Clojure函数调用通常涉及每次调用2个或3个帧
- 匿名函数有晦涩的名字
- 匿名函数在某些情况下由实现隐式创建
- 用户调用宏,但堆栈跟踪以展开的代码(你所编写的代码 != 你运行的代码)的形式进行处理——这对错误消息和堆栈跟踪都是基本问题
- 宏代码通常创建gensym名称,这些名称成为类名
- REPL基础设施在堆栈中
- 工具基础设施在堆栈中(打印器、nrepl、中间件)
- Clojure核心库和Clojure Java实现混合
- 堆栈跟踪除了显示Clojure ns或Java类,还冗余地显示了文件名
- 行号与源不正确对应
- 惰性效应
简化堆栈跟踪的功能函数需要清楚地说明哪些这些问题或其他潜在问题实际上是重要的。其中一些相对简单,而另一些则非常困难。
请注意,展示现实的一种替代视角将与隐藏实际信息的风险相冲突,这些信息可以阐明你为什么首先看堆栈跟踪。
如果简化堆栈打印功能是有用的,那么这可以在核心之外独立完成。特别是开发工具在这方面处于非常好的位置。