配列のスライス記法

以下のような、配列のスライス記法を提案します。

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] = itemsv.splice(start, end - start, items)に等価です。

endstartより小さい場合、v[start..end]はエラーとする場合と、v[start..start]とする場合が考えられます。

また、..を二項演算子とする場合と、[..]で一つの三項演算子とする場合とが考えられます。

..を二項演算子にする場合、数値の範囲を表すrange型を追加する必要があります。
range型はnum in min..(max + 1)で数値が範囲内にあるかを調べるといったような使い方も考えられます。
..演算子によってrangeを作成するKotlinにおいては、..演算子の優先順位は加減算より低く、大小比較より高いです(なお、Kotlinにおいて..演算子によるrangeは右辺の値を含む範囲となります)。

[..]で一つの三項演算子とする場合、
負のインデックスを対象の配列の末尾からの位置とするという拡張ができます。

終値を含むか含まないかを明示できるようにするために..=..<といった記法も考えられます。

Related: