K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>> (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
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!