UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture15/ throw1.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
 (throw "abort!")
 (/ 1 0)
 (display "done")
 (catch (x)
   (display (string-append "caught " x))))