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