#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))))