在合约中使用一个接口来实现它自己的功能

Using an interface in contracts for its own functions

这个例子说明了我的问题:

我想为多种集合定义一个通用接口。特别感兴趣的是二进制 add-all 方法,它同时采用 returns 和 collection。我希望语言能尽可能多地为我检查,所以我在上面签了合同。

(define collection
   (interface ()
     <other stuff>  
     [add-all (->m (is-a?/c collection) (is-a?/c collection))]))

这当然会报错:

 collection: undefined;
 cannot reference an identifier before its definition

如何在合同中使用 collection 接口来实现 collection 的方法?

我尝试使用 letrec,但它没有用,因为这个例子在初始化之前使用了 collection

我试过 recursive-contract 显然有效:

(define collection
   (interface ()
     [add-all (->m (recursive-contract (is-a?/c collection))
                   (recursive-contract (is-a?/c collection)))]))