4.3.5. クラス優先順位リストの決定
クラスのdefclass
フォームは、 そのクラスとそのdirect
スーパークラスの全体の順序を提供します。 その順番はローカルの優先順位と呼ばれます。 これはそのクラスとそのdirect
スーパークラスを順序付けしたリストです。 クラスC
のクラス優先順位リストは、 C
とそのdirect
スーパークラスの全体の順序であり、 これは各C
とそのdirect
スーパークラスの ローカルの優先順位を含みます。
あるクラスは、そのdirect
スーパークラスの先に立ち、 あるdirect
スーパークラスは、 defclass
フォームのスーパークラスのリストの右側に指定された その他の全てのdirect
スーパークラスに先立ちます。 全てのクラスC
に対して、次のような定義をします。
R_C = {(C,C1), (C1,C2), , ..., (Cn-1,Cn)}
ただしC1,...,Cn
はC
のdefclass
フォームを参考に 順序付けられたdirect
スーパークラスです。 これらの順序付けられたペアは、 クラスC
とそのdirect
スーパークラスの全体の順番を生成します。
ここでS_C
をC
とそのスーパークラスの集合とします。 ここでR
は次のようになります。
R = U_{CはS_Cの要素} R_C
(TeXで書くとR = \bigcup_{C \in S_C} R_C
)
R_C
とCはS_Cの要素
が矛盾するかどうかによって、 R
の集合が部分的な順序を生成するかもしれませんし、しないかもしれません。 それらが矛盾しないことを仮定するとR
は部分順序を生成します。 もしR_C
が矛盾しているときは、R
に一貫性が無いと言います。
C
のクラス優先順位リストの計算をするために、 R
によって生成された部分順序を反映したS_C
の要素に対して トポロジカルソートを行います。 トポロジカルソートが、Rに関して他のクラスが先行しない 2つ以上のクラスの集合からクラスを選択しなければならないとき、 選択されるクラスは、以下に述べるように決定的に選ばれます。
もしR
が矛盾していたとき、エラーが発生します。