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

欢迎!请参阅关于页面以了解更多关于这个网站如何运作的信息。

+5
语法和读取器
已关闭

当我们在一个UUID字面量中写一个符号时,报告的错误信息是错误的

(截至1.11.1)

clojure -M -e '#uuid id'
Execution error (AssertionError) at clojure.main/main (main.java:40).
Assert failed: (string? form)

这是错误的,因为

它应该像这样

Reader error (AssertionError) at clojure.uuid/default-uuid-reader (uuid.clj:12).
Assert failed: (string? form)

一个第二步的改进可能是添加到数据字面量上的spec支持,就像宏一样。

Syntax error reading #uuid id at (REPL:1)
id - failed: string? at: [:form]

来自#clojure-dev Slack频道

Alex: 你不需要在那里做任何特别的事情 - 只需要在数据读取函数上做一个instrumented spec

运行之后

(s/fdef clojure.uuid/default-uuid-reader :args (s/cat :form string?))
(clojure.spec.test.alpha/instrument `clojure.uuid/default-uuid-reader)

信息变成了

Syntax error reading source at (REPL:2:1).
Call to #'clojure.uuid/default-uuid-reader did not conform to spec.

这是一个更好的信息。

它还包括了一个#:clojure.error{:phase :read-source}在ex-data中。
因此,修复方案就是给clojure.uuid/default-uuid-reader添加一个spec

已关闭,备注: 补丁已应用以显式测试并抛出一个运行时异常,改进了报告。已更新网站上的数据读取函数建议。

1 个回答

+2
by
by
谢谢Alex。简单评论:使用assert的定制数据读取器仍会报告错误。我认为假设数据读取器(即捕获可抛出异常)的解决方案可能会更好。
...