配列のスライス記法
以下のような、配列のスライス記法を提案します。
let a = [0, 1, 2, 3]
<: a[1..3] // [1, 2]
<: a[2..2] // []
<: a[1..] // [1, 2, 3]
<: a[..3] // [0, 1, 2]
<: a[..] // [0, 1, 2, 3]
b = [0, 1, 2, 3]
b[2..2] = [4]
<: b // [0, 1, 2, 4, 3]
c = [0, 1, 2, 3]
c[2..2] = []
<: c // [0, 1, 3]
d = [0, 1, 2, 3]
d[..] = []
<: d // []
変数宣言文や代入文の左辺にある場合を除き、
v[start..end]はv.slice(start, end)、
v[..]はv.copy()に等価です。
また、v[start..end] = itemsはv.splice(start, end - start, items)に等価です。
endがstartより小さい場合、v[start..end]はエラーとする場合と、v[start..start]とする場合が考えられます。
また、..を二項演算子とする場合と、[..]で一つの三項演算子とする場合とが考えられます。
..を二項演算子にする場合、数値の範囲を表すrange型を追加する必要があります。
range型はnum in min..(max + 1)で数値が範囲内にあるかを調べるといったような使い方も考えられます。
..演算子によってrangeを作成するKotlinにおいては、..演算子の優先順位は加減算より低く、大小比較より高いです(なお、Kotlinにおいて..演算子によるrangeは右辺の値を含む範囲となります)。
[..]で一つの三項演算子とする場合、
負のインデックスを対象の配列の末尾からの位置とするという拡張ができます。
終値を含むか含まないかを明示できるようにするために..=や..<といった記法も考えられます。
Related:
- #267
- #612
endがstartより小さい場合
逆順にするのも面白そう?
[0, 1, 2, 3, 4][3..0]が[3, 2, 1]になるみたいな感じで どうでしょう?
[..]で一つの三項演算子とする場合、 負のインデックスを対象の配列の末尾からの位置とするという拡張ができます
今arr[-1]はindex out of rangeエラーになる仕様なので、[..]記法もそちらに揃えた方が分かりやすいのではないかと思います
末尾からの位置をやるなら、arr.at()が負のインデックス対応なのでそちらでやりたいです。
range型の構造を工夫すればなんとか…?
今
arr[-1]はindex out of rangeエラーになる仕様なので、[..]記法もそちらに揃えた方が分かりやすいのではないかと思います 末尾からの位置をやるなら、arr.at()が負のインデックス対応なのでそちらでやりたいです。 range型の構造を工夫すればなんとか…?
arr.at(start..end)が部分配列を返す感じですかね?
従来のarr.at()は1つの要素を返すのでarr.slice()か新規の関数にしたいです。
あー確かにsliceがrangeも可という形にしたほうが納まりがいいですね
よく考えると、数値リテラルの小数部分を省略できるようになると、1..to_strがスライス記法か数値に対するプロパティアクセスなのかの曖昧性が出てきますね……。
数値リテラルのプロパティアクセスは滅多に書かないと思うので、それは(1.).to_strと書くようにして、1..to_strはスライス記法とすることになりそうですね。
~~もしも #953 がマージされたら、すぐに..をトークナイズできるようにして、とりあえずは1..to_strがエラーになるようにしないと……~~
#953 において、1..to_strがエラーになるようにしました。