BTW: your macro is way too complicated. Here's how *I* would do it.
(define-syntax define-record (lambda (x) (define gen (lambda (id fmt) (lambda (fld) (datum->syntax id (string->symbol (format fmt (syntax->datum id) (syntax->datum fld))))))) (syntax-case x () [(_ name (field* ...) printer) #'(define-record name (field* ...))] [(_ name (field* ...)) (with-syntax ([(getter* ...) (map (gen #'name "~s-~s") #'(field* ...))] [(setter* ...) (map (gen #'name "set-~s-~s!") #'(field* ...))]) #`(define-record-type name (sealed #t) ; for better performance (opaque #t) ; for security (nongenerative) ; for sanity (fields (mutable field* getter* setter*) ...)))])))
BTW: your macro is way too complicated. Here's how *I* would do it.
(define-syntax define-record
(datum- >syntax id
(string- >symbol
(format fmt (syntax->datum id) (syntax->datum fld)))))))
#'(define- record name (field* ...))]
(map (gen #'name "~s-~s") #'(field* ...))]
[(setter* ...)
(map (gen #'name "set-~s-~s!") #'(field* ...))])
#`(define- record- type name
( sealed #t) ; for better performance
( opaque #t) ; for security
( nongenerative) ; for sanity
( fields (mutable field* getter* setter*) ...)))])))
(lambda (x)
(define gen
(lambda (id fmt)
(lambda (fld)
(syntax-case x ()
[(_ name (field* ...) printer)
[(_ name (field* ...))
(with-syntax ([(getter* ...)