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电报频道

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
谢谢Alex。简短评论:使用assert的定制数据读取器仍然会报告问题。我认为那些对数据读取器假设更少的解决方案(即捕获可抛出异常的解决方案)更好。
...