评论由:amalloy 提出
好吧,感谢你的反馈——我很高兴我在进行最后一个补丁时知道它可能是不正确的 :)。我曾以为我需要实现 LazySeq 实现的 Java 集合接口,例如 java.util.List,以避免破坏像 (defn range-list (link: n) (ArrayList. (range n))) 这样的互操作函数。如果只实现 ISeq(以及因此 IPersistentCollection)就足够了,那么这还是相当容易管理的。
尽管如此,对于每个新的源代码来说,这仍然是一大堆不便的模板代码;如果我将 defseq 放到 core_deftype 中,你会欢迎它吗?如果是这样,那么似乎最好实现互操作接口;如果不是,我可以跳过它们,并为每个新的源类型实现 ISeq,IPersistentCollection 和 Seqable 的 7 个(难道不是更多?)方法。
感谢你指出 clojure.lang.Range —— 我没有意识到我们这里有它。当然,通过实现继承,使 Range,Iteration 等继承自 LazySeq 并从它们扩展协议很容易。但这意味着将功能从 clojure 移动到 java,而这并不是我们想要做的。
我会准备一个补丁,其中手写实现这两个新类型等的 ISeq,很可能在今天稍晚些时候完成。