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

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

(define (try thunk recovery)
  (let/cc esc
    (parameterize ([exception 
                    (lambda (x) (esc (recovery x)))])
      (thunk))))

(try
 (lambda ()
   (begin
     (throw "abort!")
     (/ 1 0)
     (display "done")))
 (lambda (x)
   (display (list "caught" x))))