(define-syntax make-obj (ir-macro-transformer (lambda (exp inject compare) (define (symbol->obj-proc-name base separator sym) (string->symbol (string-append (->string base) separator (->string sym)))) `(begin (define ,(inject (symbol->obj-proc-name 'make "-" (inject (cadr exp)))) (lambda args (map (match-lambda ((k v) `(,k . ,v))) (chop args 2)))) (define ,(inject (symbol->obj-proc-name (inject (cadr exp)) "" "->list")) (lambda (obj) obj)) (define ,(inject (symbol->obj-proc-name "list->" "" (inject (cadr exp)))) (lambda (obj) obj)) ,@(map (lambda (sym) `(define ,(inject (symbol->obj-proc-name (inject (cadr exp)) "-" (inject sym))) (lambda (l) (alist-ref ',sym l)))) (cddr exp))))))