Lisp 在Racket中的结构上定义合约时出错

Lisp 在Racket中的结构上定义合约时出错,lisp,racket,contract,Lisp,Racket,Contract,我试图为从另一个结构继承的结构定义一个契约 #lang racket (require racket/contract racket/contract/parametric) (struct semigroup (op)) (struct monoid (mempty) #:super struct:semigroup) (define (semigroup/c a) (struct/dc semigroup [op (-> a a a)])) (define (monoid/c

我试图为从另一个结构继承的结构定义一个契约

#lang racket

(require racket/contract racket/contract/parametric)

(struct semigroup (op))

(struct monoid (mempty) #:super struct:semigroup)

(define (semigroup/c a) (struct/dc semigroup [op (-> a a a)]))

(define (monoid/c a) 
    (struct/dc monoid [mempty a] [(op #:parent semigroup) (-> a a a)]))
我犯了一个错误

struct/dc: expected an identifier that names a field or a sequence with a field name, the #:parent keyword, and the parent
struct
  at: (op #:parent semigroup)
  in: (struct/dc monoid (mempty a) ((op #:parent semigroup) (-> a a a)))
我看不出我做错了什么


我正在使用racket6.9。

我现在没有时间键入完整答案,但是如果您编写
(struct monoid semigroup(mempty))
而不是使用
:super
子句,那么您的程序将可以工作。要点是
#:super
在运行时动态设置子类型关系,但是
struct/dc
需要静态的超类型信息。Ok。谢谢如果你发布一个答案,我会接受。我现在没有时间键入完整的答案,但是如果你写
(struct monoid semigroup(mempty))
而不是使用
:super
子句,你的程序就会工作。要点是
#:super
在运行时动态设置子类型关系,但是
struct/dc
需要静态的超类型信息。Ok。谢谢如果你给我回信,我会接受的。