(define-syntax cc (er-macro-transformer (lambda (form r c) (##sys#check-syntax 'condition-case form '(_ _ . _)) (let ((exvar (r 'exvar)) (kvar (r 'kvar)) (%and (r 'and)) (%memv (r 'memv)) (%else (r 'else))) `(,(r 'handle-exceptions) ,exvar (##core#let ((,kvar (,%and (##sys#structure? ,exvar (##core#quote condition) ) (##sys#slot ,exvar 1)))) (,(r 'cond) ,@(let lp ((seen-catchall? #f) (clauses (cddr form)) (conditions '())) (if (null? clauses) (##sys#fast-reverse (if seen-catchall? conditions (cons `(,%else (##sys#signal ,exvar)) conditions))) (let* ((clause (car clauses)) (var (and (symbol? (car clause)) (car clause))) (kinds (if var (cadr clause) (car clause))) (check (if (null? kinds) %else `(,%and ,kvar ,@(map (lambda (k) `(,%memv (##core#quote ,k) ,kvar)) kinds)))) (body (if var `(##core#let ((,var ,exvar)) ,@(cddr clause)) `(##core#begin ,@(cdr clause)) ))) (if (and (null? kinds) (pair? (cdr clauses))) (##sys#notice "clauses following catchall clause in condition-case" (##sys#strip-syntax clause))) (lp (or (null? kinds) seen-catchall?) (cdr clauses) (cons `(,check ,body) conditions)) ))))) ,(cadr form))))))