我希望通过直接指向有问题的对象而不是指向周围的列表来改进错误消息。例如,在一个 `let` 块中,存在一个无法解析的深层嵌套符号,语法错误将指向 `(let` 的位置,而不是指向有问题的符号
(let [{a :very-long-key
b :another-long-key
c :extremely-annoyingly-long-key
{:keys [dddddddddddd eeeeeeeeeeee fffffffff]
:as options}
:final-very-long-key} d]
'...)
; 语法错误编译位置在 (example.clj:1:1).
; 在此上下文中无法解析符号:d
这可以改为说 `Syntax error compiling at (example.clj:6:30)`,因为这里是 `d` 的位置。
另一个例子是 hiccup 语法,它是使用向量关键词编写 HTML 的流行方法。某些库如 Reagent 会以不同的方式处理以符号开头的向量。如果其中一个符号拼写错误,`r/render` 的调用中的周围代码会被高亮显示为失败,而不是具体符号,有时这个符号可能位于下方 10 行或 100 行(如同我在一些项目代码中所见 :grimacing:).
我在为不匹配的括号制作错误时也看到了这种用法的作用。现在,如果你说了 `(some-fn ... [a b c)`,在打开方括号和关闭圆括号之间有行,错误将指向关闭圆括号。如果所有括号都携带位置数据,则错误可以表述为“Syntax error reading source at (example.clj:N:M). Unmatched delimiter: ). Expected ] to match [ at (example.clj:X:Y)”