interface - Racket:接口(interface)的前向声明

标签 interface scheme racket

如果我有两个并排定义的接口(interface),并且我希望在契约(Contract)内的另一个接口(interface)中引用每个接口(interface),即:

(define context-interface<%>
  (interface ()
    [entity-list (->m (listof (is-a?/c entity-interface<%>)))]
    )
  )

(define entity-interface<%>
  (interface ()
    [on-add (->m (is-a?/c context-interface<%>) void?)]
    )

我应该怎样做才能避免在定义之前无法引用标识符错误?我在 Racket 文档中没有找到类似 C++ 中的前向声明的含义。来自 answer对于我之前的问题,我知道可以使用lazy-require以某种方式解决问题,但是如果我想将两个定义保留在同一个源文件中怎么办?

最佳答案

您可以通过添加 recursive-contract 来修复递归合约中的此类“值未初始化”错误围绕契约(Contract)的一部分,推迟该部分的评估,直到需要为止。在这种情况下,您可以添加 recursive-contract 左右(is-a?/c entity-interface<%>) .

(define context-interface<%>
  (interface ()
    [entity-list (->m (listof (recursive-contract (is-a?/c entity-interface<%>))))]
    ))

(define entity-interface<%>
  (interface ()
    [on-add (->m (is-a?/c context-interface<%>) void?)]
    ))

请注意,它可以在 (is-a?/c entity-interface<%>) 左右因为这是契约(Contract)值(value),但它不能只是entity-interface<%>左右因为这是 Racket /类接口(interface)值,而不是契约(Contract)。

关于interface - Racket:接口(interface)的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59823776/

相关文章:

c# - 您应该为接口(interface)、具体实现或两者编写 XML 注释吗?

lisp - 学什么 Scheme vs Lisp

scheme - PLTScheme如何捕获错误?

lisp - DrRacket 中的简单嵌套评估

scheme - 将树表示为列表

java - 空白的 final 字段 conn 可能尚未在非 final 成员上初始化

java - 如何将抽象类编写为接口(interface)

c# - 将接口(interface)的事件从 VB.Net 转换为 C#

Scheme 中的流 - 通过方案中的流映射定义整数

scheme - Racket/Scheme 编译为单个二进制文件,没有依赖项? FFI 和静态链接