List 組込みオブジェクトこの章では組込み変数領域が初めから備えている
List 組込みオブジェクトを定義する。
List はスクリプトで扱われる可変長リスト (配列) オブジェクト
に対応する Type
のインスタンスである。
以下の条件を全て満たすオブジェクトをリストオブジェクトという:
List
のインスタンスであるか、初期の List.prototype
と同じオブジェクトである。elements という名前の内部メンバを持ち、その値は原始リストである。原始リストに
含まれる全てのデータはオブジェクトであり、その個数は有限である。リストオブジェクトは、有限個のオブジェクトを順序付きで保持する
抽象データ構造を表す。リストオブジェクトが保持する各オブジェクト
(elements 内部メンバの値が含むデータ)
をリストオブジェクトの要素という。
リストの要素は一意の (重複のない) 番号によって識別する。この番号をインデックスという。インデックスは要素が elements
内部メンバの値の何番目に含まれているかを表しており、1
以上で要素の個数以下の整数である。
一般にリストの内容は読み取り専用ではなく、要素の個数も自由に変化する。しかし
リストオブジェクトの isReadOnly プロパティに Boolean.true を設定すると、リストは読み取り専用とみなされる。
リストオブジェクトは、少なくとも作られた当初は List
のインスタンスでなければならない (List.prototype
自身がリストオブジェクトと見なされる場合を除く)。
リストオブジェクトのプロトタイプが変更されて List
のインスタンスではなくなった場合、それ以降そのオブジェクトを
リストオブジェクトと見なすかどうかは実行環境の裁量による。
List のメンバprototypeEnum.prototype
を準プロトタイプとするオブジェクト。name"List"of メソッドelements 内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L
とする。concat メソッドelements 内部メンバの値を
渡された引数の順に e1, e2,
…, en とする。(n
は引数の個数)elements 内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L
とする。List の内部メンバ$prototypeType.prototypeList の関数としての呼出しList
は関数として呼出し可能であり、関数として呼出されると次の処理を行う:
elements
内部メンバを持つ。Real
オブジェクトならば、以下の動作を行う:
OutOfRangeError のインスタンスを投げる。Void.void を O
とする。elements 内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L
とする。リストオブジェクトは以下のプロパティを持つ。ただし、
List.prototype やその準プロトタイプのプロパティが
スクリプトの実行によって変更された場合は、この限りではない。
countInteger
オブジェクトである。この値は、このリストオブジェクトの現在の
elements 内部メンバの値に含まれている要素の個数を表す。UnsupportedOperationError のインスタンスが投げられる。Real
オブジェクトでなければ、新しい TypeError のインスタンスを投げる。OutOfRangeError のインスタンスを投げる。elements 内部メンバの値を
e とする。isReadOnly 内部メンバを持つならば、
新しい ReadOnlyError
のインスタンスを投げる。Void.void である。elements
内部メンバの値を、e′ に変更する。elements
内部メンバの値を、e′ に変更する。count プロパティに整数を代入する
ことによって、リストオブジェクトの要素数を変更できる。要素数が減少する場合、
リストの最後の方にある余った要素はリストから削除される。要素数が増加する場合、
足りない要素を補うためにリストの最後の方に @void が追加される。
負の要素数を設定しようとすると OutOfRangeError エラーが、
リストが読み取り専用の場合は ReadOnlyError エラーが投げられる。
isReadOnlyisReadOnly 内部メンバを持つならば、
このプロパティの値は初期の Boolean.true である。さもなくば、このプロパティの値は初期の
Boolean.false である。Boolean.false
を代入することと同じように処理される。Boolean.true ならば、
isReadOnly
内部メンバを持たなければ、isReadOnly 内部メンバを作成し
N をその値に設定する。Boolean.false ならば、
isReadOnly
内部メンバを持つならば、新しい ReadOnlyError のインスタンスを投げる。TypeError のインスタンスを投げる。@true を代入することで、
リストを読み取り専用にすることができる。一度読み取り専用になったリストを
元の状態に戻すことは出来ない。insert メソッドNumberOfArgumentsError
のインスタンスを投げる。さもなくば一つ目の引数を I とする。Void.void を @this
値、I を唯一の引数として、Math.ceil を関数として呼出し、その結果に対して
get-reference-value
を行い、その結果を r とする。Integer オブジェクトならば、そのオブジェクトが表す整数と
1 との最大値を i とする。さもなくば、新しい TypeError のインスタンスを投げる。elements 内部メンバの値を
e とする。Void.void
を適当な個数だけ追加して、要素数を i − 1 にした原始リストを改めて
e とする。elements
内部メンバの値を、e′ に変更する。append メソッドpush メソッドelements 内部メンバの値を
e とする。elements
内部メンバの値を、e′ に変更する。pop メソッドelements 内部メンバの値を
e とする。Void.void]] を返す。elements
内部メンバの値を、e′ に変更する。prepend メソッドunshift メソッドelements 内部メンバの値を
e とする。elements
内部メンバの値を、e′ に変更する。shift メソッドelements 内部メンバの値を
e とする。Void.void]] を返す。elements
内部メンバの値を、e′ に変更する。reverse メソッドelements 内部メンバの値を
e とする。elements
内部メンバの値を、e′ に変更する。concat メソッドList.concat を関数として呼出し、その結果を返す。copy メソッドelements
内部メンバを持つ。@{ List[@this] }findIndex メソッドNumberOfArgumentsError
のインスタンスを投げる。さもなくば一つ目の引数を P とする。NotCallableError
のインスタンスを投げる。elements 内部メンバの値を
e とする。Void.void を @this
値、I を唯一の引数として、Math.ceil を関数として呼出し、その結果に対して
get-reference-value
を行い、その結果を r とする。Integer オブジェクトならば、そのオブジェクトが表す整数と
1 との最大値を i とする。さもなくば、新しい TypeError のインスタンスを投げる。NaN オブジェクト]]
を返す。Void.void を @this 値、e[i]
を唯一の引数として、P を関数として呼出し、その結果に対して
get-reference-value
を行い、その結果を r とする。Integer オブジェクト]] を返す。elements
内部メンバの値が変化したならば、それ以降の動作は未定義とする。このメソッドは、一つ目の引数を述語関数と見なして、
リストの要素のうちその述語を満たす最初のもののインデックスを返す。
二番目の引数でインデックスを指定すると、そのインデックス以降についてのみを
検索の対象とする。述語を満たす要素がない場合は @nan を返す。
例えば以下のコードでは、リストには整数 1, 10, 100, 1000 が含まれており、
述語として 50 より大きい
を指定している。この述語を満たす最初の要素は 100
であり、そのインデックスは 3 であるから、findIndex メソッドの結果は
3 となる。
List.of[1, 10, 100, 1000].findIndex[& # > 50 ]
findLastIndex メソッドNumberOfArgumentsError
のインスタンスを投げる。さもなくば一つ目の引数を P とする。NotCallableError
のインスタンスを投げる。elements 内部メンバの値を
e とする。Void.void を @this
値、I を唯一の引数として、Math.floor を関数として呼出し、その結果に対して
get-reference-value
を行い、その結果を r とする。Integer オブジェクトならば、そのオブジェクトが表す整数と
e.count との最小値を i とする。さもなくば、新しい TypeError のインスタンスを投げる。NaN オブジェクト]]
を返す。Void.void を @this 値、e[i]
を唯一の引数として、P を関数として呼出し、その結果に対して
get-reference-value
を行い、その結果を r とする。Integer オブジェクト]] を返す。elements
内部メンバの値が変化したならば、それ以降の動作は未定義とする。このメソッドは、一つ目の引数を述語関数と見なして、
リストの要素のうちその述語を満たす最後のもののインデックスを返す。
二番目の引数でインデックスを指定すると、そのインデックス以前についてのみを
検索の対象とする。述語を満たす要素がない場合は @nan を返す。
find メソッド@{ @this[@this.findIndex[[$args]]] }findIndex メソッドと
同様に述語を満たす要素を検索するが、インデックスではなくて要素そのものを返す点が
異なる。findLast メソッド@{ @this[@this.findLastIndex[[$args]]] }findLastIndex メソッドと
同様に述語を満たす要素を検索するが、インデックスではなくて要素そのものを返す点が
異なる。indexOf メソッド@[obj] {
$args[1] = @bind obj.$equal;
@return @this.findIndex[[$args]];
}@nan を返す。オブジェクトが等しいかどうかの判定は ==
によって行う。lastIndexOf メソッド@[obj] {
$args[1] = @bind obj.$equal;
@return @this.findLastIndex[[$args]];
}@nan を返す。オブジェクトが等しいかどうかの判定は ==
によって行う。contains メソッド@[obj] { $args.forAll[@bind @this.indexOf] }getEnum メソッドtoNext メソッドが null を返す) までに
このリストオブジェクトの elements 内部メンバが変更された場合は、
それ以降の列挙操作の挙動は規定しない。@{
@var toNext = @{
@this.index ||= 0;
@if ++@this.index > #source.count:
@return @null;
@this.item = #source[@this.index];
@return @this;
};
@return Enum[toNext, @this];
}getCyclicEnum メソッドelements 内部メンバが変更された場合は、
それ以降の列挙操作の挙動は規定しない。また、リストオブジェクトの要素が一つも
存在しないときは、列挙オブジェクトは何も列挙しない。@{
@var toNext = @{
@if #source.count == 0:
@return @null;
@this.index ||= 0;
@if ++@this.index > #source.count:
@this.index = 1;
@this.item = #source[@this.index];
@return @this;
};
@return Enum[toNext, @this];
}toNext メソッド@{ @this.getEnum[].toNext[] }toString メソッド$prototypeList.prototype、または List.prototype
を準プロトタイプとするオブジェクト。elementsisReadOnlyリストオブジェクトは関数として呼出し可能である。 リストオブジェクトが関数として呼出されると次の処理を行う:
List のインスタンスを L
とする。NumberOfArgumentsError のインスタンスを投げる。Void.void または初期の Null.null または
NaN オブジェクトならば、
[[初期の Void.void]] を返す。Real
オブジェクトならば、以下の動作を行う:
Enum
のインスタンスならば、式 a.map[l].toList[]
を評価し、その結果を返す。ただし、この式における部分式 a
の評価結果は [[A]] とし、部分式 l
の評価結果は [[L]] とする。リスト要素参照は参照の一種である。全てのリスト要素参照は、それぞれ対応する リストオブジェクト L と整数 i を持つ。
リスト要素参照に対する動作を以下に定める:
elements
内部メンバの値を e とする。Boolean.true]]
を返す。さもなくば [[初期の Boolean.false]] を返す。elements
内部メンバの値を e とする。Void.void]] を返す。isReadOnly
プロパティの値が初期の Boolean.true ならば、新しい ReadOnlyError のインスタンスを投げる。OutOfRangeError のインスタンスを投げる。elements
内部メンバの値を e とする。elements 内部メンバの値を、新しい原始リスト e′
に変更する。e′ に含まれる k 個目のオブジェクトは、
Void.voidisReadOnly
プロパティの値が初期の Boolean.true ならば、新しい ReadOnlyError のインスタンスを投げる。elements
内部メンバの値を e とする。elements 内部メンバの値を、新しい原始リスト e′
に変更する。e′ に含まれる k 個目のオブジェクトは、
Void.void]]
を返す。リスト範囲参照は参照の一種である。全てのリスト範囲参照は、それぞれ対応する リストオブジェクト L と整数の集合 R を持つ。
リスト範囲参照に対する動作を以下に定める:
Boolean.true]]
を返す。elements 内部メンバの値を e
とする。1 以上 e.count 以下の整数の集合と R
との積集合を R′ とする。elements 内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L′
とする。ただし、L′ のプロトタイプは L とする。elements 内部メンバの値を e
とする。isReadOnly
プロパティの値が初期の Boolean.true ならば、新しい ReadOnlyError のインスタンスを投げる。OutOfRangeError
のインスタンスを投げる。OverflowError のインスタンスを投げる。Void.void
を適当な個数だけ追加して、要素数を m − 1 にした原始リストを改めて
e とする。elements 内部メンバの値を e′ として、以下の動作を行う:
elements 内部メンバの値を、e″
に変更する。isReadOnly
プロパティの値が初期の Boolean.true ならば、新しい ReadOnlyError のインスタンスを投げる。elements 内部メンバの値を e
とする。1 以上 e.count 以下の整数の集合と R
との積集合を R′ とする。elements 内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L′
とする。ただし、L′ のプロトタイプは L とする。elements 内部メンバの値を、e′
に変更する。