评论者:amalloy
好了,谢谢你的反馈——我很高兴我知道那个最后的补丁可能不正确。我以为我需要实现LazySeq的Java集合接口,比如java.util.List,以避免破坏诸如(range n)(ArrayList.)之类的互通函数。如果只需要实现ISeq(以及IPersistentCollection),那么这相当容易管理。
尽管如此,对于每个新的源来说,这仍然是一大堆样板代码;如果你不把defseq宏放在core_deftype中,你会接受这样的宏吗?如果是这样,那么或许最好实现互通接口;如果不是,我可以跳过它们,并为每个新源类型实现ISeq、IPersistentCollection和Seqable中的7(不是9个)方法。
感谢你向我指出clojure.lang.Range——我没有意识到我们在那里有它的作用。当然,有了实现继承,它会很容易让Range、Iteration等从LazySeq继承,并从它们扩展协议。但这意味着将功能从clojure移到java,而我们本来可能不想这么做。
我今天晚些时候将手动为这两种新的类型分别实现ISeq,并将其包含在一个补丁中。