> And the 'is-pt' macro:
> 
>   (define-syntax is-pt
> 
>     (lambda (stx)
> 
>       (syntax-case stx ()
> 
>       ((is-pt p)
> 
>        (with-syntax ( (p.x (gen-id #'p #'p ".x"))
>                       (p.y (gen-id #'p #'p ".y"))
> 
>                       (p.x! (gen-id #'p #'p ".x!"))
>                       (p.y! (gen-id #'p #'p ".y!"))
> 
>                       (p.neg       (gen-id #'p #'p ".neg"))
>                       (p.norm      (gen-id #'p #'p ".norm"))
>                       (p.normalize (gen-id #'p #'p ".normalize")) )
> 
>          #'(begin
> 
>              (define-syntax p.x
>                (identifier-syntax
>                 (pt-x p)))
> 
>              (define-syntax p.y
>                (identifier-syntax
>                 (pt-y p)))
> 
>              (define-syntax p.x!
>                (syntax-rules ()
>                  ((p.x! val)
>                   (pt-x-set! p val))))
> 
>              (define-syntax p.y!
>                (syntax-rules ()
>                  ((p.y! val)
>                   (pt-y-set! p val))))
> 
>              (define-syntax p.neg
>                (syntax-rules ()
>                  ((p.neg)
>                   (pt::neg p))))
> 
>              (define-syntax p.norm
>                (syntax-rules ()
>                  ((p.norm)
>                   (pt::norm p))))
> 
>              (define-syntax p.normalize
>                (syntax-rules ()
>                  ((p.normalize)
>                   (pt::normalize p))))))))))

I factored out the code for generating the getter and setter syntax:

(define-syntax define-get-field-syntax
  (lambda (stx)
    (syntax-case stx ()
      ((_ var field get)
       (with-syntax ((var.field (gen-id #'var #'var "." #'field)))
         #'(begin
             (define-syntax var.field
               (identifier-syntax
                (get var)))))))))

(define-syntax define-set-field-syntax
  (lambda (stx)
    (syntax-case stx ()
      ((_ var field set)
       (with-syntax ((var.field! (gen-id #'var #'var "." #'field "!")))
         #'(begin
             (define-syntax var.field!
               (syntax-rules ()
                 ((var.field! val)
                  (set var val))))))))))

For example, an 'is-pt' which only defines the getter and setter syntax
is:

(define-syntax is-pt

  (lambda (stx)

    (syntax-case stx ()

      ((is-pt var)

       (syntax

        (begin

          (define-get-field-syntax var x pt-x)
          (define-get-field-syntax var y pt-y)

          (define-set-field-syntax var x pt-x-set!)
          (define-set-field-syntax var y pt-y-set!)))))))

Ed

Reply via email to