评论者: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,并将其作为补丁附件,可能是今天晚些时候。