Kuina-chan

くいなちゃん2018年12月15日


プログラミング言語Kuin」の逆引き辞典5、変数と定数と関数の扱い方についてです。

目次

1変数を扱う

1.1変数を作る



変数を作るには、「var 変数名: 型名」と書きます(図1-1)。
  1. var a: int
  2.  
  3. func main()
  4.   var b: int
  5.   var c: int :: 7
  6.  
  7.   do @a :: 3
  8.   do b :: 5
  9. end func
図1-1: 変数の作成
1行目のように関数の外で変数を作ると、プログラムの起動時に作られて終了時に破棄される「グローバル変数」になります。 4~5行目のように関数の中で作ると、関数が呼び出されたときに作られて抜けるときに破棄される「ローカル変数」になります。
ローカル変数に限って、5行目のように変数の作成と同時に値を代入することができます。
7~8行目で作成した変数にアクセスしています。 グローバル変数にアクセスするときには、7行目のように変数名の前に「@」を付ける必要があります。
変数を作成してから値を代入するまでは、型のデフォルト値が入っています。 例えばint型では0が入ります。

2定数を扱う

定数とは、値に解りやすく名前を付けたものです。

2.1定数を使う



定数を定義するには、「const 定数名: 型名 :: 」と書きます(図2-1)。
  1. const three: int :: 3
  2.  
  3. func main()
  4.   const five: int :: 5
  5.  
  6.   var n: int
  7.   do n :: @three {3}
  8.   do n :: five {5}
  9. end func
図2-1: 定数の作成
定数はコンパイル時には、値を直接書いたことと同じとみなしてコンパイルされるため、実行時にメモリを消費しません。

3関数を扱う

3.1関数を作る



関数を作るには、「func 関数名(引数1, 引数2, ...): 戻り値の型」から「end func」の間に命令を書きます(図3-1)。
  1. func add(a: int, b: int): int
  2.   ret a + b
  3. end func
  4.  
  5. func main()
  6.   func sub(a: int, b: int): int
  7.     ret a - b
  8.   end func
  9.  
  10.   var n: int
  11.   do n :: @add(5, 3) {8}
  12.   do n :: sub(5, 3) {2}
  13.   ret
  14. end func
図3-1: 関数の作成
1~3行目で関数「add」を作成し、6~8行目で関数「sub」を作成しています。 5~14行目の「main」関数も、関数です。
関数の外で作った関数を呼び出すときには、関数名の前に「@」を付けて11行目のように呼び出します。 関数の中で作った関数を呼び出すときには12行目のように呼び出します。 関数の中で作った場合にはその関数内でしか呼び出せず、予期しない呼び出され方を防ぐことができます。
2行目や7行目のように「ret 戻り値」と書くと、戻り値を返しながら関数を抜けます。 戻り値のない関数を作るには、5行目の「main」関数のように戻り値の型を省略して書き、関数を途中で抜けるときには13行目のように「ret」とだけ書きます。
「ret」文を使わず関数を自然に抜けた場合には、戻り値の型のデフォルト値が返ります。

3.2引数に渡した変数の値を書き換える



関数の引数に変数を指定したときには、変数の値だけが渡るため、関数内で書き換えても変数の値は変わりません。 関数内で書き換えたときに元の変数の値も書き換わるようにするには、引数の型の前に「&」を付けます(図3-2)。
  1. func setZero1(n: int)
  2.   do n :: 0
  3. end func
  4.  
  5. func setZero2(n: &int)
  6.   do n :: 0
  7. end func
  8.  
  9. func main()
  10.   var a: int :: 5
  11.   do @setZero1(a) {a = 5}
  12.   do @setZero2(&a) {a = 0}
  13.   do @setZero2(&)
  14. end func
図3-2: 参照渡し
1行目のsetZero1関数では、2行目でnの値は0になりますが、呼び出し元のaの値は変わりません。
5行目のsetZero2関数は引数nの型の前に「&」が付いているため、6行目でnの値を0にすると、呼び出し元のaの値も書き換わります。 このような引数に変数を渡すときには、12行目のように変数の前にも「&」を付けて、関数内で書き換わることを明記する必要があります。
関数は戻り値が1つしか返せませんが、この「&」の引数を使うことで、戻り値を複数返すこともできます。
また、型の前に「&」が付いている引数に、13行目のように「&」とだけ書いて呼び出すと、デフォルト値が入った使い捨ての変数が作られて関数に渡されます。 「&」の引数で戻り値を返している場合に、その戻り値を受け取る必要が無いときにはこの記法が便利です。

3.3関数を変数に代入する



関数は変数に代入することができ、その場合の型は「func<(引数1の型, 引数2の型, ...): 戻り値の型>」となります(図3-3)。
  1. func add(a: int, b: int): int
  2.   ret a + b
  3. end func
  4.  
  5. func main()
  6.   var f: func<(int, int): int>
  7.   do f :: @add
  8.   var n: int :: f(5, 3) {8}
  9. end func
図3-3: 関数の型
7行目で変数fに関数@addを代入していて、8行目でfを関数呼び出ししています。 このとき実際には@addが呼び出されます。
関数の引数にコールバック関数を渡してもらいたいときなどに使います。
1544814585jaf