CLOSの流れを汲むSTklos系のメタクラスメタクラスの自動算出です。CLOSが動くScheme処理系は結構あるようですが、より処理系と統合されたり構文が改良されたりしているのがSTklos系のようです。CLOSの系譜をいまいち把握できていないので外しているかもしれません。今回のメタクラスの自動算出に関しては、上記処理系で共通なのでSTklos系ということにしましょう。クラスのインスタンシエーション等に解説されていますが、define-classに:metaclassが明示されていればそれを使う指定がなければダイレクトスーパークラスのメタクラスのクラス順位リスト中を調べてメタクラスが一つに定まればそれを使う複数なら、その複数のメタクラスをスーパークラスとするメタクラスを生成して使うとなります。メタクラスのクラス順位リスト中をどう調べるのかは、コードは簡単なので詳細はコードを眺めた方が早いでしょう。Lispに移植したものです。オリジナルではクラス名をgensymで生成していますが、下記ではスーパークラス名のリストを名前としてみています。定義できたので動作を確認していきます。b-class)))前回と同じく、a-class、b-class、c-classとメタクラスを定義し、a-classをメタクラスとしたa、b-classをメタクラスとしたbを作成します。())とした場合に、cのメタクラスがどのように求まるかを確認してみます。42E014EC0B>ECLOSではc-classが算出されましたが、STklosでは新たにメタクラスが生成されています。一度生成されたメタクラスはensure-metaclass-with-supersが保持していて、同様のメタクラスの組み合わせが既に存在すれば、それが使われるので重複して生成することはありません。42E014EC0B>まとめ今回は、STklos系のメタクラスの自動算出を眺めてみました。メタクラスのサブクラス方向を探しに行くECLOSとは違って、STklosは継承の最下層になっているメタクラスを集め、複数なら合成して返す、という感じでした。試してみた感じでは、開発時のようにクラスの再定義や削除、同じ定義が別名で定義されたり(実際には名前を付け替えているつもり)が頻発する環境だと、ECLOSが探索するサブクラスのメンテナンスがなおざりになることが多いので、算出された結果も開発者の直感からすると古い情報に基いてしまったりすることがあるようです。クラスを削除、再定義すれば良いのでそういうユーティリティを充実させるのも良いかもしれません。STklos系は、動的にメタクラスを生成するのと、クラス順位リストがサブクラスに比べてきっちり更新されるので、トラブルらしいトラブルには遭遇していません。どちらの方式が便利なのか......。両方の方式を日々比較検討試していきたいと思います。