K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>>try(closure(throw) { >>> }, >>> closure() { >>> }); >> >>この例はちょっと意味が良く分かりませんでした。 > >説明不足ですみません。これ全体がJavaでいうところのtry catchになっており、 >ライブラリ関数tryの第1引数にtry節、第2引数にcatch節のclosureを渡します。 >また、catch節側にも引数が要りますね。 > >function try(c1, c2) { > exception = null; > toplevel: { > throw = closure(ex) { > exception = ex; > break toplevel; > }; > c1(throw); > } > if (exception != null) { > c2(exception); > } >} > >こういうtry関数をライブラリで用意することで、アプリケーション側では > >try(closure(throw) { > # try節 > }, > closure(exception) { > # catch節 > }); > >こう書けるのかなあ、と。 > >>Common Lisp 等にある return/return-from の機能は、もっと >>原始的な感じで、むしろ C の setjmp/longjmp に近いレベルに >>なります。たとえば、break にラベル指定ができるとすると、 >>(Lisp 風じゃなくて crowbar 風に書くと) こういう感じになる >>と思います。 >… >>for (;;) { >> toplevel: { >> exit_to_toplevel = closure() { break toplevel; }; >> command = キー入力; >> do_it(command); >> } >>} > >breakの機能自体は、同じものを想定していると思っています。 > >>上のように書くにしても、ユーザーが明示的に closure を変数に >>セーブするのではなく、closure は catch & throw マクロに >>付随する連想リストの中に隠されて、ユーザの目には見えなくなります。 > >crowbarで上記try関数を書くとして、もしローカル変数がダイナミックスコープに >なっていれば、throwのクロージャを引数で渡さなくてよさそうなんですが、 >ダイナミックスコープは混乱しそうなので付ける気はないわけでして、 >Lispはレキシカルスコープでもクロージャの受け渡しができるわけでしょうか。 >Lispのマクロは、「コードを示すリストをプログラムからいじること」という >レベルでしか理解していないです。throwに相当するシンボルをさくっと >置き換えればよいのかな。 >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!