(define-syntax cc (syntax-rules () ((_ ?checked-expression ?clauses ...) (letrec-syntax ((cc-internal (macro-rules () ((_ ?recur ?catchall ?exn ?kvar) (if ?catchall `(void) `(##sys#signal ,?exn))) ((_ ?recur ?catchall ?exn ?kvar ?clause . ?rest) (let* ((var (and (symbol? (car ?clause)) (car ?clause))) (kinds (if var (cadr ?clause) (car ?clause))) (body (if var (caddr ?clause) (cadr ?clause)))) (if (and (null? kinds) (not (null? ?rest))) (##sys#notice "clauses following catch-all clause in condition-case" (strip-syntax ?clause))) `(if ,(or (null? kinds) `(and ,?kvar ,@(map (lambda (k) `(memv ',k ,?kvar)) kinds))) (let ,(if var `((,var ,?exn)) '()) ,body) (,?recur ,?recur ,?catchall ,?exn ,?kvar . ,?rest))))))) (handle-exceptions exn (let ((kvar (and (##sys#structure? exn 'condition) (##sys#slot exn 1)))) (cc-internal cc-internal #f exn kvar ?clauses ...)) ?checked-expression)))))