gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:43:28 26 4
gpt4 key购买 nike

如果我有两个并排定义的接口(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?)]
)

我应该怎么做才能避免 cannot reference an identifier before its definition错误?我没有在 Racket docs 中找到任何类似于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com