我正在尝试使用Racket编写对象,我正在尝试实现“继承”。
(define-syntax class-trait
(syntax-rules (with)
[(class <Class> (<attr> ...) (with <traits> ...)
[(<method> <param> ...) <body>]...)
(define (<Class> <attr> ...)
(lambda (msg)
(cond [(equal? msg (id->string <attr>)) <attr>]
...
[(equal? msg (id->string <method>))
(lambda (<param> ...) <body>)]
...
[else ((<traits> <param> ...) ... msg)]
))
)]))
这就是我目前所拥有的,但对于最后的else语句,省略号不起作用。
答案 0 :(得分:2)
让我们首先讨论错误的含义:&#34;模板&#34;的不兼容的省略号匹配计数。
假设a
匹配(1 x #t)
和b
匹配(2 y #f)
,那么
模板((a b) ...)
生成((1 2) (x y) (# f)
。
现在,如果a
匹配(1 x)
而b
匹配(2 y #f)
,那么((a b) ...)
会产生什么? a
和b
的匹配计数不兼容(长度相同)。
在我的代码中,我认为是模板
((<traits> <param> ...) ...
如果<traits>
的数量与<param> ...
的数量不匹配,则可能会出现问题。