2023年03月26日くいなちゃん


プログラミング言語Kuin」の実行環境がexe用の逆引き辞典2、配列と文字列の扱い方についてです。

配列を扱う

配列の配列を扱う

文字列を扱う

目次

1配列を扱う

「配列」とは、同じ型の複数の変数をまとめて扱える型です。

1.1配列を作成する



Kuinでの配列は「[]型名」と書くことで、その型の値が複数集まった配列を表すことができます(図1-1)。
  1. func main()
  2.   var array: []int
  3.   do array :: #[3]int {[0, 0, 0]}
  4.   do array[0] :: 5 {[5, 0, 0]}
  5.   do array :: [1, 2, 3, 4] {[1, 2, 3, 4]}
  6. end func
図1-1: 配列
2行目のように「[]int」とすると、int型の配列になります。
3行目のように「#[要素数]型名」と書くことで、指定した要素数の配列のインスタンス(実体)が生成されます。 各要素にはその型のデフォルト値が入り、int型の場合は0です。
4行目のように「配列の変数名[要素番号]」と書くことで、その配列の要素に値を読み書きできます。 要素番号は0から始まり、最後の要素では「要素数-1」になります。
5行目のように「[値1,値2,...,値n]」と書くことで、各要素の値を指定してインスタンスを生成することもできます。

1.2配列の要素数を得る



配列の要素数は要素数演算子「^」で得ることができます。 図1-2は、配列のすべての要素に順番に代入するプログラムです。
  1. func main()
  2.   var array: []int :: #[10]int
  3.   for i(0, ^array - 1)
  4.     do array[i] :: i
  5.   end for
  6. end func
図1-2: 配列の要素数
3行目の「^array」で10が返ります。 4行目によって、array[0]には0が、array[1]には1が、array[9]には9が入ります。

1.3配列を結合する



2つの配列を結合するには、配列連結演算子「~」を使います(図1-3)。
  1. func main()
  2.   var array1: []int :: [1, 3, 5]
  3.   var array2: []int :: [2, 4, 6]
  4.   var array3: []int :: array1 ~ array2 {[1, 3, 5, 2, 4, 6]}
  5. end func
図1-3: 配列連結

1.4配列の各要素を同じ値で埋める



配列の各要素を同じ値で埋めるには、「.fill」メソッドを使います(図1-4)。
  1. func main()
  2.   var array: []int
  3.   do array :: #[5]int {[0, 0, 0, 0, 0]}
  4.   do array.fill(123) {[123, 123, 123, 123, 123]}
  5. end func
図1-4: fillメソッド

1.5配列の要素を繰り返して新しい配列を作成する



配列の要素を繰り返して新しい配列を作成するには、「.repeat」メソッドを使います(図1-5)。
  1. func main()
  2.   var array: []int :: [3, 5] {[3, 5]}
  3.   var array2: []int :: array.repeat(4) {[3, 5, 3, 5, 3, 5, 3, 5]}
  4. end func
図1-5: repeatメソッド

1.6配列の一部を切り出す



配列の一部を切り出すには、「.sub」メソッドを使います(図1-6)。
  1. func main()
  2.   var array: []int :: [1, 2, 3, 4, 5, 6] {[1, 2, 3, 4, 5, 6]}
  3.   var array2: []int :: array.sub(3, 2) {[4, 5]}
  4.   var array3: []int :: array.sub(2, -1) {[3, 4, 5, 6]}
  5. end func
図1-6: subメソッド
「.sub(a, b)」と書くと、a番目の要素から、b個分の要素が切り出されます。 bに-1を指定すると、配列の最後の要素まで切り出されます。

1.7配列を昇順や降順で並び替える



配列を昇順で並び替えるには「.sort」メソッドを使い、降順で並び替えるには昇順で並べた後に「.reverse」メソッドで逆順にします(図1-7)。
  1. func main()
  2.   var array: []int :: [3, 6, 2, 4, 1, 2] {[3, 6, 2, 4, 1, 2]}
  3.   do array.sort() {[1, 2, 2, 3, 4, 6]}
  4.   do array.reverse() {[6, 4, 3, 2, 2, 1]}
  5. end func
図1-7: ソート
「.sort」メソッドは、配列の要素の型が大小比較できる場合でのみ使えます。

1.8配列を逆順に並び替える



配列を逆順に並び替えるには、「.reverse」メソッドを使います(図1-8)。
  1. func main()
  2.   var array: []int :: [3, 6, 2, 4, 1, 2] {[3, 6, 2, 4, 1, 2]}
  3.   do array.reverse() {[2, 1, 4, 2, 6, 3]}
  4. end func
図1-8: 逆順

1.9配列から要素を検索する



配列から要素を検索するには、「.find」「.findLast」メソッドを使います(図1-9)。
  1. func main()
  2.   var array: []int :: [3, 6, 5, 4, 5, 1]
  3.   var pos: int
  4.   do pos :: array.find(5, -1) {2}
  5.   do pos :: array.find(5, 2) {2}
  6.   do pos :: array.find(5, 3) {4}
  7.   do pos :: array.find(5, 5) {-1}
  8.   do pos :: array.findLast(5, -1) {4}
  9.   do pos :: array.findLast(5, 4) {4}
  10.   do pos :: array.findLast(5, 3) {2}
  11.   do pos :: array.findLast(5, 1) {-1}
  12. end func
図1-9: 配列の要素の検索
「.find(a, b)」と書くと、b番目の要素からaを探して、見つかった要素番号を返します。 見つからなければ-1を返します。 「.findLast(a, b)」も同様ですが、配列の末尾から先頭に向かう方向に探します。
配列の中身が昇順に並んでいるときには「.findBin」メソッドで高速に検索(二分探索)できます。 同じ配列を何度も検索する場合には一度「.sort」メソッドで昇順に並べ替えてから「.findBin」を使うと良いでしょう(図1-10)。
  1. func main()
  2.   var array: []int :: [1, 2, 4, 6, 7] {昇順に並んだ配列}
  3.   var pos: int :: array.findBin(6) {3}
  4. end func
図1-10: 配列の要素の二分探索
見つかったときには要素番号が、見つからなかったときには-1が返ります。 「.findBin」メソッドは、配列の要素の型が大小比較できる場合でのみ使えます。

2配列の配列を扱う

2.1配列の配列を扱う



Kuinでは多次元配列は、配列の配列で扱います。 つまり、2次元のint型の配列は「[][]int」のように、配列をさらに配列にして扱います(図2-1)。
  1. func main()
  2.   var array: [][]int :: [[1, 2], [3, 4, 5], [6]]
  3. end func
図2-1: 配列の配列
この場合の要素は、表2-1のように並ぶイメージになります。
表2-1: 配列の配列の例
1 2
3 4 5
6
多次元配列の各次元の要素数が決まっているとき(つまり2次元の場合は長方形)、配列のインスタンスを一度に生成することができます(図2-2)。
  1. func main()
  2.   var array: [][][]int :: #[3, 2, 5]int
  3. end func
図2-2: 多次元配列の初期化
この例ではarray[0][0][0]からarray[2][1][4]までの要素が作られます。 要素の値はデフォルト値(int型の場合は0)になります。

3文字列を扱う

3.1文字列を扱う



Kuinでは文字列は、文字型の配列「[]char」で扱います。 このため、配列に用意された機能はすべて文字列でも使えます(図3-1)。
  1. func main()
  2.   var str1: []char :: "abc"
  3.   var str2: []char :: "def"
  4.   var str3: []char :: str1 ~ str2 {"abcdef"}
  5. end func
図3-1: 文字列型
「"abc"」とは「['a', 'b', 'c']」と同じ意味で、文字列型でのみ使える書き方です。

3.2別の型から文字列型へ変換する



int型などの別の型から文字列型へ変換するには「.toStr」メソッドを使います(図3-2)。
  1. func main()
  2.   var n: int :: 5
  3.   var x: float :: 1.23
  4.   var str1: []char :: n.toStr() {str1 = "5"}
  5.   var str2: []char :: x.toStr() {str2 = "1.23"}
  6. end func
図3-2: toStrメソッド
「.toStr」メソッドが使える型は、int型、float型、char型、bool型、各ビット型、[]char型、クラスです。

3.3文字列型からint型やfloat型へ変換する



文字列型からint型やfloat型へ変換するには、それぞれ「.toInt」「.toFloat」メソッドを使います(図3-3)。
  1. func main()
  2.   var str1: []char :: "5"
  3.   var str2: []char :: "1.23"
  4.   var existed: bool
  5.   var n: int
  6.   var x: float
  7.  
  8.   do n :: str1.toInt(&existed) {existed = true, n = 5}
  9.   do x :: str2.toFloat(&existed) {existed = true, x = 1.23}
  10. end func
図3-3: toInt、toFloatメソッド
「.toInt」「.toFloat」メソッドの引数には、変換に成功するとtrueが、失敗するとfalseが返ります。

3.4文字列中に変数の値を埋め込む



文字列中に変数の値を埋め込むには、「\{変数}」と書きます(図3-4)。
  1. func main()
  2.   var n: int :: 1234
  3.   var str: []char :: "n = \{n}" {" n = 1234 "}
  4. end func
図3-4: 変数の埋め込み
「"\{n}"」と書くと、コンパイル時に「"" ~ (n).toStr() ~ ""」に置換されます。 変数だけでなく「"\{1 + 2}"」など任意の式が書けます。

3.5文字列を比較する



「=」や「<」などの比較演算子で、文字列の大小を辞書順(辞書でどちらが先に出てくるか)で比較できます。 ただし、各文字の大小は文字コードの大小で決まります。 文字列のインスタンスが一致しているかを比較したり、nullかどうかを比較するには、参照比較演算子「=&」「<>&」を使います(図3-5)。
  1. func main()
  2.   var s1: []char :: "pen"
  3.   var s2: []char :: "pencil"
  4.   var s3: []char :: "pencil"
  5.   var s4: []char :: s2
  6.   var b: bool
  7.   do b :: s1 <= s2 {true}
  8.   do b :: s1 >= s2 {false}
  9.   do b :: s2 = s3 {true}
  10.   do b :: s2 =& s3 {false}
  11.   do b :: s2 =& s4 {true}
  12.   do b :: s2 =& null {false}
  13. end func
図3-5: 文字列の比較

3.6文字列を置換する



文字列中のある文字列を別の文字列に置換するには「.replace」メソッドを使います(図3-6)。
  1. func main()
  2.   var s1: []char :: "abc<br>def<br>g"
  3.   var s2: []char :: s1.replace("<br>", "/") {"abc/def/g"}
  4. end func
図3-6: 文字列の置換

3.7文字列を区切り文字列で分割する



文字列を区切り文字列で配列に分割するには「.split」メソッドを使います(図3-7)。
  1. func main()
  2.   var s: []char :: "abc<br>def<br>g"
  3.   var ss: [][]char :: s.split("<br>") {["abc", "def", "g"]}
  4. end func
図3-7: 文字列の分割

3.8配列を区切り文字列で結合する



配列を区切り文字列で1つの文字列に結合するには「.join」メソッドを使います(図3-8)。
  1. func main()
  2.   var ss: [][]char :: ["abc", "def", "g"]
  3.   var s: []char :: ss.join("<br>") {"abc<br>def<br>g"}
  4. end func
図3-8: 文字列の結合

3.9文字列の左右の余白を削除する



文字列の左右の余白を削除するには「.trim」「.trimLeft」「.trimRight」メソッドを使います(図3-9)。
  1. func main()
  2.   var s1: []char :: "   a b c   "
  3.   var s2: []char
  4.   do s2 :: s1.trim() {"a b c"}
  5.   do s2 :: s1.trimLeft() {"a b c   "}
  6.   do s2 :: s1.trimRight() {"   a b c"}
  7. end func
図3-9: 文字列の余白の削除
「.trim」「.trimLeft」「.trimRight」メソッドで、それぞれ左右、左側のみ、右側のみの余白が削除されます。 削除される余白は、タブ文字、改行文字、半角スペースなどです(文字コードで、0x09以上0x0D以下、0x20、0xA0)

3.10文字列を大文字や小文字で揃える



文字列を大文字や小文字で揃えるには、それぞれ「.upper」「.lower」メソッドを使います(図3-10)。
  1. func main()
  2.   var s1: []char :: "Kuin Programming Language"
  3.   var s2: []char
  4.   do s2 :: s1.upper() {"KUIN PROGRAMMING LANGUAGE"}
  5.   do s2 :: s1.lower() {"kuin programming language"}
  6. end func
図3-10: 大文字化と小文字化
1679822419jaf