admin管理员组文章数量:1405607
I want to create a macro with fields defined as (<field-name> <field-getter> [ setter <field-setter> ] [ default <field-default> ]) (default is for future developments). To accommodate the need of the optional setter keyword in record field definition, I use a submacro. But the macro does not expand. How could it be done ?
Code :
(import
(scheme base))
(define-syntax record-type-field-spec
(syntax-rules (setter default)
((_ name getter setter setter-name default default-value)
(name getter setter-name))
((_ name getter setter setter-name)
(name getter setter-name))
((_ name getter)
(name getter))
((_ name getter setter setter-name)
(name getter setter-name))
((_ name getter default default-value)
(name getter))))
(define-syntax define-record-type-2
(syntax-rules ()
((_ name
(maker params ...)
predicate
(field-name field-getter field-other ...) ...)
(define-record-type
name
(maker params ...)
predicate
(record-type-field-spec field-name field-getter field-other ...)
...))))
(define-record-type-2
Rec
(make-Rec a b c d)
Rec?
(a Rec-a)
(b Rec-b setter Rec-b!)
(c Rec-c default #f)
(d Rec-d setter Rec-d! default #f))
Given by chibi :
ERROR: unknown record field in constructor
a
((#<SC 140018294227808 record-type-field-spec #<procedure #f 1>> a Rec-a) (#<SC 140018294227808 record-type-field-spec #<procedure #f 1>> b Rec-b setter Rec-b!) (#<SC 140018294227808 rec
ord-type-field-spec #<procedure #f 1>> c Rec-c default #f) (#<SC 140018294227808 record-type-field-spec #<procedure #f 1>> d Rec-d setter Rec-d! default #f))
called from <anonymous> on line 1268 of file /gnu/store/g9dqsd7m9h60av70lih8q4kdf259scsl-chibi-scheme-0.11/share/chibi/init-7.scm
called from <anonymous> on line 800 of file /gnu/store/g9dqsd7m9h60av70lih8q4kdf259scsl-chibi-scheme-0.11/share/chibi/init-7.scm
And by gosh:
*** ERROR: invalid field spec: (#<identifier r7rs.user#record-type-field-spec.fcf59dc0> b Rec-b setter Rec-b!)
While compiling "./test.scm" at line 34: (define-record-type-2 Rec (make-Rec a b c d) Rec? (a Rec-a) (b Rec-b setter Rec-b!) (c Rec-c default ...
While loading "./test.scm" at line 41
Stack Trace:
_______________________________________
0 (proc (next))
1 (add! (proc (next)))
2 ((macro-transformer mac) expr cenv)
3 (call-macro-expander gval program cenv)
4 (pass1 program cenv)
5 (eval s #f)
6 (with-error-handler (lambda (e) (cond (else (let1 e2 (if (con ...
7 (load-from-port (if ignore-coding port (open-coding-aware-por ...
Note that:
(define-record-type
Rec
(maker a b c d)
Rec?
(record-type-field-spec a Rec-a)
(record-type-field-spec b Rec-b setter Rec-b!)
(record-type-field-spec c Rec-c default #f)
(record-type-field-spec d Rec-d setter Rec-d! default #f))
Give with chibi:
ERROR: unknown record field in constructor
a
((record-type-field-spec a Rec-a) (record-type-field-spec b Rec-b setter Rec-b!) (record-type-field-spec c Rec-c default #f) (record-type-field-spec d Rec-d setter Rec-d! default #f))
called from <anonymous> on line 1268 of file /gnu/store/g9dqsd7m9h60av70lih8q4kdf259scsl-chibi-scheme-0.11/share/chibi/init-7.scm
called from <anonymous> on line 800 of file /gnu/store/g9dqsd7m9h60av70lih8q4kdf259scsl-chibi-scheme-0.11/share/chibi/init-7.scm
And with gosh:
*** ERROR: invalid field spec: (record-type-field-spec b Rec-b setter Rec-b!)
While compiling "./test.scm" at line 43: (define-record-type Rec (maker a b c d) Rec? (record-type-field-spec a Rec-a) (record-type-field-spec ...
While loading "./test.scm" at line 50
Stack Trace:
_______________________________________
0 (proc (next))
1 (add! (proc (next)))
2 ((macro-transformer mac) expr cenv)
3 (call-macro-expander gval program cenv)
4 (pass1 program cenv)
5 (eval s #f)
6 (with-error-handler (lambda (e) (cond (else (let1 e2 (if (con ...
7 (load-from-port (if ignore-coding port (open-coding-aware-por ...
本文标签: macrosError submacro used in definerecordtype field declaration not expandingStack Overflow
版权声明:本文标题:macros - Error: submacro used in `define-record-type` field declaration not expanding - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744332855a2601047.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论