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