aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

配列のスライス記法

Open takejohn opened this issue 3 months ago • 5 comments

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

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:

  • #267
  • #612

takejohn avatar Sep 24 '25 15:09 takejohn

endstartより小さい場合

逆順にするのも面白そう? [0, 1, 2, 3, 4][3..0][3, 2, 1]になるみたいな感じで どうでしょう?

FineArchs avatar Sep 25 '25 12:09 FineArchs

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

arr[-1]はindex out of rangeエラーになる仕様なので、[..]記法もそちらに揃えた方が分かりやすいのではないかと思います 末尾からの位置をやるなら、arr.at()が負のインデックス対応なのでそちらでやりたいです。 range型の構造を工夫すればなんとか…?

FineArchs avatar Sep 25 '25 12:09 FineArchs

arr[-1]はindex out of rangeエラーになる仕様なので、[..]記法もそちらに揃えた方が分かりやすいのではないかと思います 末尾からの位置をやるなら、arr.at()が負のインデックス対応なのでそちらでやりたいです。 range型の構造を工夫すればなんとか…?

arr.at(start..end)が部分配列を返す感じですかね? 従来のarr.at()は1つの要素を返すのでarr.slice()か新規の関数にしたいです。

takejohn avatar Sep 25 '25 14:09 takejohn

あー確かにsliceがrangeも可という形にしたほうが納まりがいいですね

FineArchs avatar Sep 25 '25 15:09 FineArchs

よく考えると、数値リテラルの小数部分を省略できるようになると、1..to_strがスライス記法か数値に対するプロパティアクセスなのかの曖昧性が出てきますね……。 数値リテラルのプロパティアクセスは滅多に書かないと思うので、それは(1.).to_strと書くようにして、1..to_strはスライス記法とすることになりそうですね。 ~~もしも #953 がマージされたら、すぐに..をトークナイズできるようにして、とりあえずは1..to_strがエラーになるようにしないと……~~ #953 において、1..to_strがエラーになるようにしました。

takejohn avatar Sep 25 '25 23:09 takejohn