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