如果数据读取器返回 nil,读取器将抛出 java.lang.RuntimeException: No dispatch macro... 错误消息表明,对于标签的第一个字符,没有相应的分派宏。
这里有一个简单的例子
`
user=> (binding [*data-readers* {'f/ignore (constantly nil)}}
(read-string "#f/ignore 42 10"))
RuntimeException No dispatch macro for: f clojure.lang.Util.runtimeException (Util.java:219)
`
原始的读取器代码没有区分数据读取器的缺失和合适的读取器返回 nil 的情况。因此它变得困惑,并尝试查找分派宏,导致其沿着错误的代码路径进一步下去,最终产生误导性的错误信息。
原始文档中没有区分 nil 作为非法值。很明显,这个错误是原始数据读取器代码中的疏忽,而不是有意功能。
该补丁使用哨兵值将缺失数据读取器的情况与返回值 nil 的情况区分开来。
补丁: clj-1139-2.patch