Comment 4 for bug 180455

Revision history for this message
Abdulaziz Ghuloum (aghuloum) wrote :

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*) ...)))])))