UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture15/ throw2.rkt
#lang plait
(define exception (make-parameter identity))

(define (throw msg) ((parameter-ref exception) msg))

(define-syntax-rule 
  (try expr ...  (catch (id) recovers ...))
  (let ([recovery (lambda (id) recovers ...)])
    (let/cc esc
      (parameterize 
          ([exception
            (lambda (x) (esc (recovery x)))])
        (begin expr ...)))))

(try
 (try
  (throw "abort 1\n") (display "unreached 1")
  (catch (x) (display (string-append "1:" x))))
 (throw "abort 2\n") (display "unreached 2")
 (catch (x) (display (string-append "2:" x))))