如果 data-reader 返回 nil,读取器会抛出 java.lang.RuntimeException: No dispatch macro... 该错误信息意味着,对于标签的第一个字符 happen to be 的任何值,都没有分配宏。
这是一个简单的示例
`
user=> (binding [*data-readers* {'f/ignore (constantly nil)}]
(read-string "#f/ignore 42 10"))
RuntimeException 没有分配宏用于:f clojure.lang.Util.runtimeException (Util.java:219)
`
原始的读取器代码没有区分数据读取器不存在的情况和从合适的数据读取器返回的 nil 值的情况。因此,它感到困惑并试图找到一个分配宏,使其进一步沿着错误代码路径向下运行,最终产生误导性的错误信息。
原始文档没有将 nil 作为一个非法值。很明显,这个 bug 是原始 data-reader 代码中的一个疏忽,而不是一个有意为之的功能。
该补丁使用一个哨兵值来区分缺少数据读取器的情况和返回 nil 的情况。
补丁: clj-1139-2.patch