WSOFT-Project / alicescript

The repo for the design of the AliceScript programming language
https://a.wsoft.ws/alice
3 stars 0 forks source link

[PROPOSE]:配列の範囲構文 #12

Open taiseiue opened 2 months ago

taiseiue commented 2 months ago

配列の範囲構文

概要

次の例のように、配列の特定範囲を抜き出してシャローコピーを作成する構文を導入したい。

array source = [1, 2, 3, 4, 5];

// 一番よくある使用方法
print(source[1:3]); // [2, 3]

// 終点を省略
print(source[1:]); // [1, 2, 3]

// 2つ目~逆から1つまで取得
print(source[1:-1]); // [2, 3, 4]

動機

配列の特定範囲を切り出す操作を簡単に記述できるようにするため。

詳細設計

以下のような構文を見たら、array.Sliceメソッドの呼び出しに展開する。

identifier[start:end]
-> identifier.Slice(start, end)

identifier[start:]
-> identifier.Slice(start)

identifier[:end]
-> identifier.Slice(0, end)

このとき、startendはどちらもnumber型(正負を含む)。 ただし、展開時には型検査は行わない。

以下の理由から、スライス構文は右に半開として扱う。

つまり、以下のような挙動になる。

array ary = [1, 2, 3, 4];

// 1番目~3番目の直前(つまり2番目)まで
print(ary[1:3]);
// 出力例: [2, 3]

該当ドキュメント

欠点

前例

未確定の設計

アーカイブ

範囲指定構文は次のどれにすべき?

// Pythonスタイル
source[i:j];
source[i:^j];

// スプレッド構文と混ぜたスタイル
source[i...j];
source[i...^j];
taiseiue commented 2 months ago

@rokuosan , @SotaTne

範囲指定構文どっちがいいじゃろ

// Pythonスタイル
source[i:j];
source[i:^j];

// スプレッド構文と混ぜたスタイル
source[i...j];
source[i...^j];
rokuosan commented 2 months ago

Pythonと同じ区間指定の方がおさまりが良さそう。

後者の方なら、until中置関数が欲しくなりがち。

ref: https://kotlinlang.org/docs/ranges.html ref: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/until.html

rokuosan commented 2 months ago

Pythonと同じ区間指定の方がおさまりが良さそう。

後者の方なら、until中置関数が欲しくなりがち。

ref: https://kotlinlang.org/docs/ranges.html ref: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/until.html

ちょっと嘘。

source[n:m];が半開$[n,m)$なら[n:m]で良いと思ってる。

後者の方なら、until中置関数が欲しくなりがち。

これは僕が勝手にスプレッド構文が閉区間$[n.m]$だと思っていたので、半開区間$[n,m)$を表現したいときに[n until m]のように表現できると嬉しいなぁという意図を伝えたかった。

rokuosan commented 2 months ago

なんとなくRubyとPerlの例を挙げておく。

taiseiue commented 1 month ago

これnumber : number:を両側に数値をつける二項演算子にできひんかな

rokuosan commented 1 month ago

Rangeを返す演算子ということかいな

taiseiue commented 1 month ago

そうわよ

これ考えたらオペランドを省略できてしまうから普通の演算子と同じ扱いにはでけへんかぁ

taiseiue commented 1 month ago

ひらめきひらめき

3つ演算子を追加するじゃろ(名前は後で考えるとして)

この三つでそれぞれRangeStructを返すように実装したらええんや