(define (struct->alist x) (define (f t g x) (cons t (alist-map struct->alist (g x)))) (let-syntax ((check-structs (er-macro-transformer (lambda (e r c) (let* ((types (cdr e))) `(,(r 'cond) ,@(map (lambda (t) (let ((pred? (symbol-append t '?)) (tag (symbol-append '< t '>)) (->alist (symbol-append t '->alist))) `((,pred? x) (f ',tag ,->alist x)))) types) (else x))))))) (check-structs pie cake)))