[440] Re:クラスメソッドとクラス変数
投稿者:(ぱ)
2007/02/20 02:13:25
>>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に相当するシンボルをさくっと
置き換えればよいのかな。