如果一个数据读取器返回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