List
組込みオブジェクトこの章では組込み変数領域が初めから備えている
List
組込みオブジェクトを定義する。
List
はスクリプトで扱われる可変長リスト (配列) オブジェクト
に対応する Type
のインスタンスである。
以下の条件を全て満たすオブジェクトをリストオブジェクトという:
List
のインスタンスであるか、初期の List.prototype
と同じオブジェクトである。elements
という名前の内部メンバを持ち、その値は原始リストである。原始リストに
含まれる全てのデータはオブジェクトであり、その個数は有限である。リストオブジェクトは、有限個のオブジェクトを順序付きで保持する
抽象データ構造を表す。リストオブジェクトが保持する各オブジェクト
(elements
内部メンバの値が含むデータ)
をリストオブジェクトの要素という。
リストの要素は一意の (重複のない) 番号によって識別する。この番号をインデックスという。インデックスは要素が elements
内部メンバの値の何番目に含まれているかを表しており、1
以上で要素の個数以下の整数である。
一般にリストの内容は読み取り専用ではなく、要素の個数も自由に変化する。しかし
リストオブジェクトの isReadOnly
プロパティに Boolean.true
を設定すると、リストは読み取り専用とみなされる。
リストオブジェクトは、少なくとも作られた当初は List
のインスタンスでなければならない (List.prototype
自身がリストオブジェクトと見なされる場合を除く)。
リストオブジェクトのプロトタイプが変更されて List
のインスタンスではなくなった場合、それ以降そのオブジェクトを
リストオブジェクトと見なすかどうかは実行環境の裁量による。
List
のメンバprototype
Enum.prototype
を準プロトタイプとするオブジェクト。name
"List"
of
メソッドelements
内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L
とする。concat
メソッドelements
内部メンバの値を
渡された引数の順に e1, e2,
…, en とする。(n
は引数の個数)elements
内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L
とする。List
の内部メンバ$prototype
Type.prototype
List
の関数としての呼出しList
は関数として呼出し可能であり、関数として呼出されると次の処理を行う:
elements
内部メンバを持つ。Real
オブジェクトならば、以下の動作を行う:
OutOfRangeError
のインスタンスを投げる。Void.void
を O
とする。elements
内部メンバの値とする
読み取り専用でない新しいリストオブジェクトを作成し、それを L
とする。リストオブジェクトは以下のプロパティを持つ。ただし、
List.prototype
やその準プロトタイプのプロパティが
スクリプトの実行によって変更された場合は、この限りではない。
count
Integer
オブジェクトである。この値は、このリストオブジェクトの現在の
elements
内部メンバの値に含まれている要素の個数を表す。UnsupportedOperationError
のインスタンスが投げられる。Real
オブジェクトでなければ、新しい TypeError
のインスタンスを投げる。OutOfRangeError
のインスタンスを投げる。elements
内部メンバの値を
e とする。isReadOnly
内部メンバを持つならば、
新しい ReadOnlyError
のインスタンスを投げる。Void.void
である。elements
内部メンバの値を、e′ に変更する。elements
内部メンバの値を、e′ に変更する。count
プロパティに整数を代入する
ことによって、リストオブジェクトの要素数を変更できる。要素数が減少する場合、
リストの最後の方にある余った要素はリストから削除される。要素数が増加する場合、
足りない要素を補うためにリストの最後の方に @void
が追加される。
負の要素数を設定しようとすると OutOfRangeError
エラーが、
リストが読み取り専用の場合は ReadOnlyError
エラーが投げられる。
isReadOnly
isReadOnly
内部メンバを持つならば、
このプロパティの値は初期の 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
メソッド$prototype
List.prototype
、または List.prototype
を準プロトタイプとするオブジェクト。elements
isReadOnly
リストオブジェクトは関数として呼出し可能である。 リストオブジェクトが関数として呼出されると次の処理を行う:
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.void
isReadOnly
プロパティの値が初期の 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′
に変更する。