seal generic式 (The seal generic form)

トップレベルで用いられるseal generic式というものもある。その構文は次の通り。

seal generic function ( type, ...);
functionは総称関数を参照するモジュール変数でなければならない。

typesは評価結果が<type>のインスタンスとなる表現でなければならない。 typesの個数はfunctionの受理する必須引数の個数と同じでなければならない。

ライブラリ L 内の総称関数 G に対するseal generic式で T1...Tn を型引数とするものは プログラムに次のような制約を課す。

  1. Gと合同なメソッドMで Lで明示的には知られていないメソッド (not an explicitly known method)は、M のスペシャライザの少なくとも一つがシーリング式の 対応する型と共通部分を持たない(disjointである)時、そのときに限り、Gに加えることが可能と なる。
    disjointの定義は 「新しいクラスを定める」(Defining New Classes)の節の 「スロットの一意性」(Slot Uniqueness)の項で与えられている。
  2. メソッドM は、Mのスペシャライザの少なくとも一つがシーリング式の対応する型と 共通部分を持たない時、その時に限り、Gから取り除くことができる。

  3. Lで明示的に知られていないクラスCが作成可能となる必要十分条件はG内のどのメソッド Mに対しても次の条件が成り立つことである。ただし、Cの直接上位クラスを D1...Dm 、 M のスペシャライザをS1...Sn とする。 次のようなi, j, k は存在しない:Dk は Ti の部分型、Dj は Siの部分型で、Dk は Si と 共通部分を持たない。

◆ DIRMに記載されている条件3の記述には欠陥のあることが、 メーリングリストを通じてこの翻訳の訳者により指摘された。 上に記した条件は、訂正案の日本語訳である。 (公式には未発表)

◆seal generic式は総称関数の引数の型を指定してその部分をシールする。 その総称関数にメソッドを追加・削除する場合には、このシールされている部分に 触れないことを確かめなければならない。1が追加の時の条件を、2が削除の時の条件を与えている。 また、クラスを新しく作成すると、クラス異種階層の状況によってはシールされている部分に (それまで、適用可能でなかった)メソッドがつけ加わる可能性がある。条件3はこれを 防止することを意図している。

条件3 の状況を図示すると上図のようになる。 Dk のインスタンスにはメソッド Mは適用可能でないが、もしクラスCを作成すると、 Cに属するインスタンスについては、Djの方の経路を通ってMが適用可能となり、 メソッドが新たに付け加わってしまうことになる。

seal genericの省略形(Abbreviations for seal generic)

define sealed methodは通常のメソッドを定義したのち、そのメソッドの スペシャライザの型の総称関数をシールする。define sealed methodseal generic式の簡便な省略形である。

define classへのsealedスロットオプションは通常のスロットを定めたのち、 そのクラスに対する取得総称関数をシールし、もし存在するなら設定総称関数を <object>とそのクラス上でシールする。define classへの sealedスロットオプションはseal generic式の簡便な省略形である。


目次 索引 ダイナミズムの制御(章見出し)、 コレクション (次章)