如果数据读取器返回null,读取器将抛出java.lang.RuntimeException: No dispatch macro... 错误信息意味着没有为标签的第一个字符found相应的分发宏。
这里有一个简单的例子
`
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)
`
原始的读取器代码没有区分没有数据读取器和适当的数据读取器返回null的情况。因此,它感到困惑并试图查找分发宏,导致了错误代码路径的进一步错误,并最终产生了误导性错误信息。
原始文档未将null视为非法值。显然,这个bug是原始数据读取器代码中的疏忽,而不是故意功能。
这个补丁使用哨兵值来区分缺少数据读取器的情况与返回null值的情况。
补丁: clj-1139-2.patch