struct->alist added by sjamaan on Sun May 18 15:02:46 2014

(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)))