モグラ(MOGra)の基本
Catyのレイフィケーションを整備してメタプログラミング環境を作る。
そもそも何をレイフィケーションするのか? -- メタレベルにある構造をキチンと定義する必要がある。最近、「メタレベルにある構造」をモグラ(MOGra)という名前で呼ぶことにした。Metaobject Graph の略(以前は別な名前で呼んでいた)。
モグラのノードがメタオブジェクトだが、3種に分類する。
モグラの一部分の典型的な絵:
赤い辺は束縛を表す。束縛は、名前(黒丸)と実体(値、大きめの白丸)の結び付きを意味する。名前は(黒丸より)赤い辺に乗る辺ラベルと考えたほうがいいときもある。
左の束縛(赤矢印)で、名前mが名前空間コンテナーに束縛されている。名前空間コンテナーと名前空間を結ぶ辺は名前空間ソートと呼ぶ。現在、modules, types, commands, classesなんてソートがある。
名前空間(四角の枠)の内部は束縛(赤矢印)の集まり。名前空間=束縛セット。型やコマンドの場合、名前に束縛されている実体は式(expression)で、式の中から参照辺(黒矢印)が出る。参照辺には、内部参照と外部参照がある。図で、xやyは外部の名前。
黒丸と黒丸を結ぶ青い矢印はエイリアス辺。エイリアスは、名前を別な名前と結びつける。エイリアスも束縛っちゃ束縛だが、通常の束縛とは区別したほうがいい。通常の束縛は名前空間の中での結び付きだが、エイリアスは直接に外に飛び出す。dからyへの青矢印がその例だ。
典型的な名前空間コンテナーはモジュール。「モジュールは名前空間」という言い方もするが、厳密には間違い。モジュールは名前空間コンテナーで、「型の名前空間(types)」「コマンドの名前空間(commands)」「クラスの名前空間(classes)」などを持つ。
名前空間それ自体は名前を持たないので、親であるコンテナーの名前で代用する。m.types.a は m:a というコロンドットパスでアクセスされるので、モジュール名が型名前空間の名前(の代用)となる。このことから、同じコンテナに含まれる異なる名前空間をコロンドットパスでは区別できない、という問題が発生する。が、深刻ではない。