; replace exceptions with defaults
; response to chaw
(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 '(2)) (begin (display "hello") (newline) 3))) (newline) (newline)
(define (make-try/default proc dflt)
(lambda args
(guard (exc (else dflt))
(apply proc args))))
(define-syntax try/default
(syntax-rules ()
((_ dflt body body1 ...)
((make-try/default (lambda () body body1 ...) dflt)))))
(display (try/default (begin (display "hello") (newline) 3) (car '(2)))) (newline)
OyByZXBsYWNlIGV4Y2VwdGlvbnMgd2l0aCBkZWZhdWx0cwo7IHJlc3BvbnNlIHRvIGNoYXcKCihpbXBvcnQgKHJucnMgZXhjZXB0aW9ucyAoNikpKQoKKGRlZmluZS1zeW50YXggdHJ5CiAgKHN5bnRheC1ydWxlcyAodHJ5aW5nKQogICAgKCh0cnkgdHJ5aW5nIGV4cHIgZGVmYXVsdCkKICAgICAgKGNhbGwtd2l0aC1jdXJyZW50LWNvbnRpbnVhdGlvbgogICAgICAgIChsYW1iZGEgKHJldHVybikKICAgICAgICAgICh3aXRoLWV4Y2VwdGlvbi1oYW5kbGVyCiAgICAgICAgICAgIChsYW1iZGEgKHgpIChyZXR1cm4gZGVmYXVsdCkpCiAgICAgICAgICAgIChsYW1iZGEgKCkgZXhwcikpKSkpCiAgICAoKHRyeSkgI2YpCiAgICAoKHRyeSBleHByKSAodHJ5IHRyeWluZyBleHByICNmKSkKICAgICgodHJ5IGV4cHIwIGV4cHIxIC4uLikKICAgICAgKGxldCAoKHQgKHRyeSB0cnlpbmcgZXhwcjAgI2YpKSkKICAgICAgICAoaWYgdCB0ICh0cnkgZXhwcjEgLi4uKSkpKSkpCgooZGlzcGxheSAodHJ5IChjYXIgJygyKSkgKGJlZ2luIChkaXNwbGF5ICJoZWxsbyIpIChuZXdsaW5lKSAzKSkpIChuZXdsaW5lKSAobmV3bGluZSkKCihkZWZpbmUgKG1ha2UtdHJ5L2RlZmF1bHQgcHJvYyBkZmx0KQogIChsYW1iZGEgYXJncwogICAgKGd1YXJkIChleGMgKGVsc2UgZGZsdCkpCiAgICAgIChhcHBseSBwcm9jIGFyZ3MpKSkpCgooZGVmaW5lLXN5bnRheCB0cnkvZGVmYXVsdAogIChzeW50YXgtcnVsZXMgKCkKICAgICgoXyAgZGZsdCBib2R5IGJvZHkxIC4uLikKICAgICAoKG1ha2UtdHJ5L2RlZmF1bHQgKGxhbWJkYSAoKSBib2R5IGJvZHkxIC4uLikgZGZsdCkpKSkpCgooZGlzcGxheSAodHJ5L2RlZmF1bHQgKGJlZ2luIChkaXNwbGF5ICJoZWxsbyIpIChuZXdsaW5lKSAzKSAoY2FyICcoMikpKSkgKG5ld2xpbmUp