如果数据reader返回nil,则reader会抛出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)
`
原始的reader代码没有区分没有数据reader和适当的data-reader返回nil的情况。它因此感到困惑,试图找到一个寄存器宏,导致其沿着错误代码路径进一步执行,最终产生误导性的错误消息。
原始文档中没有将nil视为非法值。显然,这个bug是原始data-reader代码中的疏忽,而不是有意的设计。
补丁使用哨兵值将缺失的数据reader案例与返回nil值案例区分开。
补丁: clj-1139-2.patch