如果数据读取器返回 nil,则读取器会抛出 java.lang.RuntimeException: 没有分发宏... 错误消息表明,第一个字符的标签对应没有分发宏。
这里有一个简单的示例
`
user=> (binding [*data-readers* {'f/ignore (constantly nil)}]
(read-string "#f/ignore 42 10"))
RuntimeException 没有分发宏:f clojure.lang(Util.runtimeException (Util.java:219))
`
原始读取器代码没有区分数据读取器不存在和适当数据读取器返回的 nil 值。因此它感到困惑,并试图寻找分发宏,将其送入错误代码路径的更低层,最终产生误导性的错误消息。
原始文档没有将 nil 识别为非法值。很明显,这个错误是原始数据读取器代码中的疏忽,而不是一个有意设计的特性。
补丁使用哨兵值来区分丢失数据读取器的情况和返回 nil 值的情况。
补丁: clj-1139-2.patch