(define-syntax easy-record (lambda (e r c) (let* ((symbol+ (lambda syms (string->symbol (apply string-append (map symbol->string syms))))) (name (cadr e)) ; 'sframe (fields (cddr e)) ; '(type val state) (tag (symbol+ ': name)) ; ':sframe (pred (symbol+ name '?)) ; 'sframe? (make (symbol+ 'make- name)) ; 'make-sframe (%lambda (r 'lambda)) (%define-record-type (r 'define-record-type)) (%define-record-discloser (r 'define-record-discloser)) (%begin (r 'begin)) (%cons (r 'cons)) (%list (r 'list)) (constructor (cons make fields)) ; '(make-sframe type val state) (accessors (map (lambda (field) (list field (symbol+ name '- field))) fields)) ; '((type sframe-type) (val sframe-val) (state sframe-state)) (disclosers (map (lambda (acc) `(,(cadr acc) o)) accessors)) ; '((sframe-type o) (sframe-val o) (sframe-state o)) (definer (append (list %define-record-type name tag constructor pred) accessors)) (discloser `(,%define-record-discloser ,tag (,%lambda (o) ,(cons 'list (cons `(quote ,make) disclosers)))))) `(,%begin ,definer ,discloser))))