> (Java風に考えれば)こんな感じですかね。
>try(closure(throw) {
> },
> closure() {
> });
この例はちょっと意味が良く分かりませんでした。
Common Lisp 等にある return/return-from の機能は、もっと
原始的な感じで、むしろ C の setjmp/longjmp に近いレベルに
なります。たとえば、break にラベル指定ができるとすると、
(Lisp 風じゃなくて crowbar 風に書くと) こういう感じになる
と思います。
exit_to_toplevel = null;
function subroutine() {
... 中略 ...
if (致命的エラーが起きたら) {
exit_to_toplevel();
}
... 中略 ...
}
function do_it(command) {
... 中略 ...
subroutine();
... 中略 ...
}
for (;;) {
toplevel: {
exit_to_toplevel = closure() { break toplevel; };
command = キー入力;
do_it(command);
}
}
あるいは、関数名を指定した return (return_from) があれば、
こんな感じです。
function subroutine(do_exit) {
... 中略 ...
if (致命的エラーが起きたら) {
do_exit(false);
}
... 中略 ...
return 1234;
}
function do_it(command) {
do_exit = closure(result) { return_from do_it result; };
... 中略 ...
value = subroutine(do_exit);
... 中略 ...
return true;
}
for (;;) {
command = キー入力;
if (!do_it(command)) {
print("error happend\n");
}
}
もっとも、Lisp でこういうプリミティブなスタイルのプログラミング
が良く行われているというわけではないですが… 上のように書くにし
ても、ユーザーが明示的に closure を変数にセーブするのではなく、
closure は catch & throw マクロに付随する連想リストの中に隠されて、
ユーザの目には見えなくなります。
また、いまどきは、もっと Java 等に似たスタイルが使われているようです。
http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html