我想通过直接指向有问题的对象,而不是指向周围的列表来改进错误信息。例如,在一个 `let` 块中,可能存在一个深嵌套的符号无法解析,语法错误会指向 `(let` 位置,而不是指向有问题的符号
(let [{a :very-long-key
b :another-long-key
c :极端无聊长的键
{:keys [dddddddddddd eeeeeeeeeeee fffffffff]}
:as options}
:final-very-long-key} d]
'...)
; 编译时在 (example.clj:1:1) 出现语法错误。
; 在此上下文中无法解析符号:d
这可以改写为 `编译时在 (example.clj:6:30) 出现语法错误`,因为 `d` 就在那里。
另一个例子是 hiccup 语法,这是使用向量关键字写入 html 的流行方法。一些库,如 Reagent,对待以符号开头的向量方式不同。如果某个符号拼写错误,则 `r/render` 的 surrounding 调用将被突出显示为失败,而不是特定的符号,这有时可能是在下面 10 到 100 行以下(如我在处理的某些代码库所见 :grimacing:)。
我还看到它在对不匹配的定界符进行错误处理时很有用。目前,如果你说 `(some-fn ... [a b c)` 并且在开方括号和闭圆括号之间有行,错误会指向闭圆括号。如果有所有括号都携带位置数据,那么错误可以说明 "在 (example.clj:N:M) 读取源时出现语法错误。未匹配的定界符:). 期望 ] 与 (example.clj:X:Y) 中的 [ 匹配 "