空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

etolisp 進捗 (12) 〜 例外処理 〜

Array と Hash の実装も終わって,いよいよ CLOS が見えてきた。アロケータの最適化とかゴミ集めなど,むずそうなトピックは取りあえず棚上げにして,まず実用的な機能をばというわけで,catch と throw の実装をした。これができると,ようやくまともなLispのテストが書けるようになる。
etolispは完全にC++にベースの実装である。ArrayやHashの実装は,実際にはSTLvectorやmapを使っている。「Lisp engaged with C++」の方針に則れば,catch や throw は当然,C++の例外の仕組みを使って実現するのがスジであろう。
そういうわけで, exception の導出クラスとして etolisp_exception を作成し,その導出クラスとして etolisp_user_exception(仮名)を作成。Lisp の throw はいつも etolisp_user_exception を投げて,Lisp の catch はこの例外しか catch しない。

以上の仕様でだいたい十分かも知れないが,任意の C++ 例外も catch できる関数もあれば,何かと便利だと思われた。例外を throw して catch して,catch でも捉えられないようなやつを華麗に掴まえる関数・・・。いろいろ妄想して「nice-catch」などと名付けてみた。自分の書いたコードがファインプレーしているみたいでいいよね。

etolisp のコードは,暇つぶしにやってるだけあって,時間をかけてかなり注意深く設計されている。全ての const には意味があって,const だらけなんだけど const_cast はひとつもないし,生ポインタと各種スマートポインタの使用基準もどれ一つ「適当」な判断をしていない。dynamic_cast もひとつもない。けっこうガチガチのポリシーで組んでいると最初のうちはけっこう辛いんだけど,あるときを境に「筋のいいコードしか組めない」ような設計になって来た気がする。ポリシーに則ってクラスを設計,変形させていったら,自分でも思いもよらなかったような綺麗な構造が浮かび上がってくるという,不思議な体験も何度かした。