Home English

Kuina-chan

くいなちゃんOct 17, 2017


プログラミング言語Kuin」のKuinの構文のチュートリアルです。

目次

文字列に式を埋め込む

文字列の中に式や変数を埋め込むには文字列に式を埋め込むのように書きます。
func main()
  var x: int :: -5
  do cui@print("x = \{x}\n")
  do cui@print("|x| + 2 = \{x.abs() + 2}\n")
end func
文字列に式を埋め込む
実行すると、「x = -5」「|x| + 2 = 7」が出力されます。
このように、文字列中に「\{~}」を書くと、括弧で囲んだ部分が式として解釈され、「(~).toStr()」に展開されます。

forで2ずつカウントダウンする

forで2ずつカウントダウンするにはforでカウントダウンのように書きます。
func main()
  for i(10, 1, -2)
    do cui@print("\{i}\n")
  end for
end func
forでカウントダウン
このプログラムではforで、10から1まで-2ずつカウントしているため、実行すると、「10」「8」「6」「4」「2」が出力されます。

whileで最低1回は実行する

whileで最初の1回だけ条件を無視し、最低1回は中身の処理を実行するにはwhileのskipのように書きます。
func main()
  var n: int :: 1
  while(n < 0, skip)
    do cui@print("abc\n")
  end while
end func
whileのskip
実行すると画面には「abc」が1回出力されます。 このように条件式のところに「, skip」を書くと、最初の1回だけ条件は無視されます。
C言語などの「do-while」に相当します。

switchに文字列の範囲を指定する

switchのcaseに、文字列の範囲を指定するにはswitchの条件のように書きます。
func main()
  var str1: []char :: "a"
  var str2: []char :: "bc"
  switch match(str1 ~ str2)
  case "aa" to "bb", "cc"
    do cui@print("\{match}\n")
  end switch
end func
switchの条件
このプログラムでは、caseの条件に「"aa"から"bb"の間、もしくは"cc"」と書かれているため、画面には「abc」が出力されます。
このようにcaseの条件には、「to」で範囲が指定でき、「,」で複数の条件が書けます。 またswitchのブロック変数(この例ではmatch)を参照すると、switchの括弧内の値(この例では"abc")が取り出せます。
switchでは文字列以外にも、cmpメソッドを継承したクラスなど、比較可能な型はすべて扱えます。

ifをbreakする

ifをbreakするにはifのbreakのように書きます。
func main()
  if a(true)
    for i(1, 10)
      break a
      do cui@print("\{i}\n")
    end for
  end if
end func
ifのbreak
このプログラムでは、画面に出力する前に4行目でifを抜けるため、何も出力されずに終わります。
このようにifだけでなく、任意のブロックにはブロック名が設定でき、break文で抜けることができます。

ソースコードを途中で折り返す

ソースコードを途中で折り返すには、途中で折り返すのように書きます。
func main()
  var n: int :: 1 + 2 + 3 +
  | 4 + 5 + 6 +
  | 7 + 8 + 9 + 10
  do cui@print("\{n}\n")
end func
途中で折り返す
実行すると、1から10までの和である「55」が出力されます。
このように行頭に「|」を書くと、前の行の続きとみなされます。

個数の上限が判らない値をlistで扱う

個数が最大でいくつになるか判らない値をlistを使って扱うには、可変長の値のように書きます。
func main()
  var strList: list<[]char> :: #list<[]char>
  
  ; 空文字列が指定されるまで文字列を受け取り続ける
  while loop(true)
    var str: []char :: cui@input()
    if(str = "")
      break loop
    end if
    do strList.add(str)
  end while
  
  var strArray: [][]char :: strList.toArray()
  do cui@print("\{^strArray}\n")
end func
可変長の値
実行すると、空文字列(何も書かずに改行)が指定されるまで文字列を受け取り続け、最終的に受け取った個数が出力されます。
このように個数の上限が判らない場合には、一旦list型で受け取ってから、個数が確定したのちに「toArray」メソッドで配列に変換すると扱いやすくなります。

listの各値を走査する

listに格納された各値を走査するには、listの走査のように書きます。
func main()
  var strList: list<[]char> :: #list<[]char>
  
  ; リストに追加する
  do strList.add("abc")
  do strList.add("def")
  do strList.add("hij")
  
  ; リストを走査する
  do strList.head()
  while(!strList.term())
    do cui@print(strList.get() ~ "\n")
    do strList.next()
  end while
  
  ; リストを逆順に走査する
  do strList.tail()
  while(!strList.term())
    do cui@print(strList.get() ~ "\n")
    do strList.prev()
  end while
end func
listの走査
実行すると、「abc」「def」「hij」「hij」「def」「abc」が出力されます。
「head」メソッドで走査ポインタを先頭に設定し、「term」メソッドで終端かどうかを判定し、「next」メソッドで走査ポインタを次に進めていきます。 そして「get」メソッドで、走査ポインタの値を取得します。
逆順の場合は、「tail」メソッドで走査ポインタを末尾に設定し、「prev」メソッドで走査ポインタを前に戻していきます。
1508205784ja