> 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