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。谢谢如果你给我回信,我会接受的。