; replace exceptions with defaults
(import (rnrs exceptions (6)))
(define-syntax try
(syntax-rules (trying)
((try trying expr default)
(call-with-current-continuation
(lambda (return)
(with-exception-handler
(lambda (x) (return default))
(lambda () expr)))))
((try) #f)
((try expr) (try trying expr #f))
((try expr0 expr1 ...)
(let ((t (try trying expr0 #f)))
(if t t (try expr1 ...))))))
(display (try (car '()) #f)) (newline)
(define a-list '((1 . 1) (3 . 3) (5 . 5)))
(define (lookup x) (try (cdr (assoc x a-list)) x))
(display (lookup 4)) (newline)
(display (try (car '()) (+ 2 2))) (newline)
OyByZXBsYWNlIGV4Y2VwdGlvbnMgd2l0aCBkZWZhdWx0cwoKKGltcG9ydCAocm5ycyBleGNlcHRpb25zICg2KSkpCgooZGVmaW5lLXN5bnRheCB0cnkKICAoc3ludGF4LXJ1bGVzICh0cnlpbmcpCiAgICAoKHRyeSB0cnlpbmcgZXhwciBkZWZhdWx0KQogICAgICAoY2FsbC13aXRoLWN1cnJlbnQtY29udGludWF0aW9uCiAgICAgICAgKGxhbWJkYSAocmV0dXJuKQogICAgICAgICAgKHdpdGgtZXhjZXB0aW9uLWhhbmRsZXIKICAgICAgICAgICAgKGxhbWJkYSAoeCkgKHJldHVybiBkZWZhdWx0KSkKICAgICAgICAgICAgKGxhbWJkYSAoKSBleHByKSkpKSkKICAgICgodHJ5KSAjZikKICAgICgodHJ5IGV4cHIpICh0cnkgdHJ5aW5nIGV4cHIgI2YpKQogICAgKCh0cnkgZXhwcjAgZXhwcjEgLi4uKQogICAgICAobGV0ICgodCAodHJ5IHRyeWluZyBleHByMCAjZikpKQogICAgICAgIChpZiB0IHQgKHRyeSBleHByMSAuLi4pKSkpKSkKCihkaXNwbGF5ICh0cnkgKGNhciAnKCkpICNmKSkgKG5ld2xpbmUpCihkZWZpbmUgYS1saXN0ICcoKDEgLiAxKSAoMyAuIDMpICg1IC4gNSkpKQooZGVmaW5lIChsb29rdXAgeCkgKHRyeSAoY2RyIChhc3NvYyB4IGEtbGlzdCkpIHgpKQooZGlzcGxheSAobG9va3VwIDQpKSAobmV3bGluZSkKKGRpc3BsYXkgKHRyeSAoY2FyICcoKSkgKCsgMiAyKSkpIChuZXdsaW5lKQ==