Interval 組込みオブジェクト

この章では組込み変数領域が初めから備えている Interval 組込みオブジェクトを定義する。

Interval のインスタンスは、区間を表す。

Interval のメンバ

prototype
Enum.prototype を準プロトタイプとするオブジェクト。
name
文字列オブジェクト "Interval"

Object の内部メンバ

$prototype
Type.prototype

Interval の関数としての呼出し

Interval は関数として呼出し可能であり、 関数として呼出されると次の処理を行う:

  1. 呼出しで渡された引数が二つ未満ならば新しい NumberOfArgumentsError のインスタンスを投げる。
  2. 新しいオブジェクトを作成し、それを I とする。 このオブジェクトはこの時点では何もメンバ・内部メンバを持たない。
  3. I$prototype 内部メンバを作成し、Interval.prototype をその値とする。
  4. Iinf メンバを作成し、一つ目の引数をその値とする。
  5. Isup メンバを作成し、二つ目の引数をその値とする。
  6. IcontainsInf メンバを作成し、三つ目の引数を値とする。ただし、 渡された引数が三つに満たなければ、初期の Boolean.true をメンバの値とする。三つ目の引数が真偽値オブジェクトでなければ、新しい ArgumentError のインスタンスを投げる。
  7. IcontainsSup メンバを作成し、四つ目の引数を値とする。ただし、 渡された引数が四つに満たなければ、初期の Boolean.true をメンバの値とする。 四つ目の引数が真偽値オブジェクトでなければ、新しい ArgumentError のインスタンスを投げる。
  8. I の四つのメンバを読み取り専用とするために、 実行環境の定めるところにより適切なメンバを I に追加する。
  9. [[I]] を返す。

Interval のインスタンスのプロパティ

Interval のインスタンスは以下のプロパティを持つ。ただし、 Interval.prototype のプロパティがスクリプトの実行によって変更された場合は、この限りではない。

inf
読み取り専用プロパティ。このプロパティの値はオブジェクトであり、Interval のインスタンスが表す区間の下限を表す。
sup
読み取り専用プロパティ。このプロパティの値はオブジェクトであり、Interval のインスタンスが表す区間の上限を表す。
containsInf
読み取り専用プロパティ。このプロパティの値は真偽値オブジェクトであり、Interval のインスタンスが表す区間の下限が区間に含まれているかどうかを表す。
containsSup
読み取り専用プロパティ。このプロパティの値は真偽値オブジェクトであり、Interval のインスタンスが表す区間の上限が区間に含まれているかどうかを表す。
contains メソッド
次の関数生成式を評価して得られるような関数オブジェクト:
@[obj] {
   @var a = @this.containsInf
      ? @bind @this.inf.$lessEqual : @bind @this.inf.$less;
   @var b = @this.containsSup
      ? @bind @this.sup.$greaterEqual : @bind @this.sup.$greater;
   @return $args.forAll[& a[#] && b[#]];
}
このメソッドは、 引数全てがこの区間に含まれているかどうかを調べる。
$equal メソッド
次の関数生成式を評価して得られるような関数オブジェクト:
@[x] {
   @return Interval.isTypeOf[x]
        && @this.inf == x.inf && @this.sup == x.sup
        && @this.containsInf == x.containsInf
        && @this.containsSup == x.containsSup;
}
getEnum メソッド
0-ary メソッド。関数として呼出されると、以下の動作を行う:
  1. 呼出しにおける @this 値に対して ints-in-interval を行い、その結果を I とする。I が正常終了でなければ直ちにそれを返す。
  2. I の値を R とする。R が null ならば新しい TypeError のインスタンスを投げる。
  3. R に下界が存在しなければ、新しい OutOfRangeError のインスタンスを投げる。
  4. R に含まれる全ての整数について、それを表す Integer オブジェクトをその値の小さいものから順に一度づつ列挙する新しい開始列挙オブジェクトを作成し、E とする。(R が空集合ならば、何も列挙しない。 R が無限集合ならば、列挙は永遠に終わらない)
  5. [[E]] を返す。
このメソッドは、この区間に含まれている整数を昇順に 列挙する列挙オブジェクトを返す。区間が実数の範囲を表していない場合は、TypeError を投げる。区間の inf プロパティが -@inf の場合、すなわち区間が負の無限大の方に無限に伸びている場合は、 OutOfRangeError を投げる。
getRevEnum メソッド
0-ary メソッド。関数として呼出されると、以下の動作を行う:
  1. 呼出しにおける @this 値に対して ints-in-interval を行い、その結果を I とする。I が正常終了でなければ直ちにそれを返す。
  2. I の値を R とする。R が null ならば新しい TypeError のインスタンスを投げる。
  3. R に上界が存在しなければ、新しい OutOfRangeError のインスタンスを投げる。
  4. R に含まれる全ての整数について、それを表す Integer オブジェクトをその値の大きいものから順に一度づつ列挙する新しい開始列挙オブジェクトを作成し、E とする。(R が空集合ならば、何も列挙しない。 R が無限集合ならば、列挙は永遠に終わらない)
  5. [[E]] を返す。
このメソッドは、この区間に含まれている整数を降順に 列挙する列挙オブジェクトを返す。区間が実数の範囲を表していない場合は、TypeError を投げる。区間の sup プロパティが @inf の場合、すなわち区間が正の無限大の方に無限に伸びている場合は、 OutOfRangeError を投げる。
toNext メソッド
次の関数生成式を評価して得られるような関数オブジェクト: @{ @this.getEnum[].toNext[] }
toString メソッド
関数として呼び出されると、渡された @this 値を文字列に変換し、その文字列を 内容とする文字列オブジェクトを値とする正常終了の結果を返す。文字列への変換の方法は実行環境に任せるが、 infsup プロパティを toString メソッドで文字列に変換したものを含み、かつ containsInfcontainsSup プロパティの値を反映しているのが望ましい。

区間に含まれる整数

ここでは、区間に含まれる整数を求める操作 ints-in-interval を定義する。 ints-in-interval の結果が正常終了ならば、その値は整数の集合または特殊な値 null である。

オブジェクト O に対する ints-in-interval の動作は、次の通りとする:

  1. OInterval のインスタンスでなければ、[[null]] を返す。
  2. o.containsInf ? Math.ceil[o.inf] : Math.floor[o.inf].$increment[] を評価し、その結果を I とする。これが正常終了でなければ、 直ちにそれを返す。ただし、式の評価において部分式 o の評価結果は [[O]] とする。
  3. 同じく式 o.containsSup ? Math.floor[o.sup] : Math.ceil[o.sup].$decrement[] を評価し、その結果を S とする。これが正常終了でなければ、 直ちにそれを返す。
  4. I の値が Integer オブジェクトならば、それが表す整数を i として、
    1. S の値が Integer オブジェクトならば、 それが表す整数を s として、[[i 以上 s 以下の全ての整数の集合]] を返す。
    2. S の値が正の無限大を表す Infinity オブジェクトならば、[[i 以上の全ての整数の集合]] を返す。
    3. S の値が負の無限大を表す Infinity オブジェクトならば、[[整数の空集合]] を返す。
  5. I の値が正の無限大を表す Infinity オブジェクトならば、[[整数の空集合]] を返す。
  6. I の値が負の無限大を表す Infinity オブジェクトならば、
    1. S の値が Integer オブジェクトならば、 それが表す整数を s として、[[s 以下の全ての整数の集合]] を返す。
    2. S の値が正の無限大を表す Infinity オブジェクトならば、[[全ての整数の集合]] を返す。
    3. S の値が負の無限大を表す Infinity オブジェクトならば、[[整数の空集合]] を返す。
  7. [[null]] を返す。
© 2006-2007 Magicant