(define fail-tag 'temp)
(call/cc (lambda (top-level)
(set! fail-tag top-level)))
(define (fail)
(fail-tag 'failed))
(define (choose . options)
(if (null? options)
(fail)
(call/cc (lambda (success)
(let ((old-fail fail-tag))
(call/cc (lambda (new-fail)
(set! fail-tag new-fail)
(success (car options))))
(set! fail-tag old-fail)
(success (apply choose (cdr options))))))))
(let ()
(display (list (choose 'a 'b 'c) (choose 1 2 3)))
(fail))
KGRlZmluZSBmYWlsLXRhZyAndGVtcCkKKGNhbGwvY2MgKGxhbWJkYSAodG9wLWxldmVsKQogIChzZXQhIGZhaWwtdGFnIHRvcC1sZXZlbCkpKQogIAooZGVmaW5lIChmYWlsKSAKICAoZmFpbC10YWcgJ2ZhaWxlZCkpCiAgICAgCihkZWZpbmUgKGNob29zZSAuIG9wdGlvbnMpCiAgKGlmIChudWxsPyBvcHRpb25zKQogICAgICAoZmFpbCkKICAgICAgKGNhbGwvY2MgKGxhbWJkYSAoc3VjY2VzcykKICAgICAgICAobGV0ICgob2xkLWZhaWwgZmFpbC10YWcpKQogICAgICAgICAgKGNhbGwvY2MgKGxhbWJkYSAobmV3LWZhaWwpCiAgICAgICAgICAgIChzZXQhIGZhaWwtdGFnIG5ldy1mYWlsKQogICAgICAgICAgICAoc3VjY2VzcyAoY2FyIG9wdGlvbnMpKSkpCiAgICAgICAgICAoc2V0ISBmYWlsLXRhZyBvbGQtZmFpbCkKICAgICAgICAgIChzdWNjZXNzIChhcHBseSBjaG9vc2UgKGNkciBvcHRpb25zKSkpKSkpKSkKICAgICAKICAgICAKIChsZXQgKCkgCiAJKGRpc3BsYXkgKGxpc3QgKGNob29zZSAnYSAnYiAnYykgKGNob29zZSAxIDIgMykpKQogCShmYWlsKSkKIAk=