>Java や C++ の例外の場合、例外の受け手は直接指定せず、受け手が
>存在しない場合はトップレベルまで伝搬するわけですが、こういう風に
>書くと、それとはだいぶ意味的に違うものになりそうです。
う。確かに私の書いたのだと、トップレベルまで伝搬しませんし、
例外の種類に関わらずcatch節に流れ込みますね。
例外の種類に関わらずcatchに流れ込むことについては、
「自分が知らない例外だったらcatch節で投げ直してよ」という方法で
いけそうな気がしますが(ていうかクラス階層という概念がないcrowbarでは、
別途例外階層を定義する手段を提供しない限りそうなってしまいそうですが)、
catch節で例外を投げなおしたときには、上位がさらにtryで囲まれていれば
そっちのtryのcatch節に流れ込むように思います(というかそう作らなければ
面白くない)。ただ、catch節で例外を投げなおすためには、上位のtry用の
クロージャを持っていなければいけないので、何かと面倒そうではあります。
>また、例外の伝搬を
>実装するために、クロージャのリストも管理することになるんじゃ
>ないかな…
こういうことですかね。
>でも Lisp みたいなマクロがないと、文法的に結構面倒くさそうなので、
>言語レベルで定義しちゃった方が、むしろ好ましいかもしれませんね。
ということで言語レベルで定義しようとせこせこ弄り回しているわけですが、
上に書いたように、crowbarにはクラス階層の概念がないので、どうやって
catchしたものか考えているところです。
Common Lispの例外処理は、ちょっとぐぐって以下のページを見つけたのですが、
http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp16.html
やっぱり階層構造を(おそらくライブラリレベルで)実現していますね。
上に書いたような「なんでもcatchに流れ込むから、あとはアプリケーションで
投げ直してくれ」という戦略をとるにせよ、なんらかの方法で識別がつかないと
そもそもアプリケーションでも区別がつきませんから、どうしようかと
考えているところです。
(1)例外の種類の区別を、言語レベルで提供するか、ライブラリレベルで提供するか、
規約レベルの話にするか。
(2)例外の種類別catchを、言語レベルで提供するか、アプリケーションで
判断してもらうか。
Javaのように、catchを例外の種類ごとに書く方法だと、OR条件(この例外と
この例外の時にはこうする)のようなものが書きにくくて、なんとかならんもんかと
常々思っているのですが…