Amalloy 发布的评论:
好吧,感谢你的反馈——我很高兴我在提交上一个补丁时知道它可能是错误的 :)。我认为我需要实现 LazySeq 所做的 Java 集合接口,例如 java.util.List,以便避免破坏像 (defn range-list (link: n) (ArrayList. (range n))) 这样像互操作性函数。如果只需要实现 ISeq(以及 IPersistentCollection),那么这是相当容易管理的。
尽管如此,对于每个新的来源,这仍然是一段令人厌烦的样板代码;如果不将其放入 core_deftype,你能接受一个像 defseq 这样的宏吗?如果可以,似乎最好实现互操作性接口;如果不能,我可以选择跳过它们,并在每个新的来源类型中实现 ISeq、IPersistentCollection 和 Seqable 的 7 个(不,它应该是 9 个)方法。
感谢你指出 clojure.lang.Range 给我——我没想到我们在这里有它。当然,通过实现继承,可以很容易地让 Range、Iteration 等继承自 LazySeq,并从它们扩展协议,但这意味着将功能从 clojure 移动到 java,我认为我们不希望这样做。
我将会为这两种新的类型手动实现 ISeq,并可能在今天稍后附上补丁。