program. Scheme 两层异常的案例与比较函数[mce-self-error-cases]

(define errors
   '((missing (missing) mce-unbound)
     (arity (((lambda (x) x) 1 2)) mce-arity)
     (call ((1 2)) mce-not-procedure)
     (syntax ((if #t 1)) mce-syntax)
     (parameters ((lambda (x x) x)) mce-syntax)))

(define (error-key thunk)
   (catch #t (lambda () (thunk) 'returned)
     (lambda (key . arguments) key)))

(define (errors-agree? example)
   (let ((program (cadr example)) (expected (caddr example)))
     (and (eq? (error-key (lambda () (run-scheme program))) expected)
          (eq? (error-key (lambda () (run-inside program))) expected))))