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