2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面了解更多关于如何使用本站的信息。

+1
语法和读取器
编辑

只有列表才包含位置数据,尽管大多数非原生数据实现了 IObj 接口。这是为什么吗?在读取时是否有可能将位置数据添加到所有 IObj 对象中?

user=> (meta '(1 2 3))
{:line 1, :column 8}
user=> (meta 'abc)
nil

1 答案

0

您正在尝试解决什么问题?

我想通过直接指向有问题的对象,而不是指向周围的列表来改进错误信息。例如,在一个 `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) 中的 [ 匹配 "
by
我忘记提到,这对宏编写者也很有用,他们可以利用非列表上的位置数据来编写信息性错误消息。我偶尔看到有人抱怨宏丢弃了位置数据,而这个修改将有助于改善这种状况。
by
我对这个特性也非常感兴趣。我希望能够结合使用 `clojure.lang.Compiler/analyze` 来找出给定 Clojure 表达式中所有局部绑定的用法,在 Clojure 编辑器中突出显示所有此类用法,并允许用户重命名该绑定及其所有用法。

目前,我必须依靠 clojure.tools.reader 为每个读取的表达式分配行和列号。

除此之外,我认为这个特性将能够启用其他有用的静态分析和错误报告功能。

就我的使用情况而言,至少,如果这是 `read` 的一个可选特性,并且在默认情况下是关闭的,那就足够了。
...