Kuina-chan

くいなちゃん2018年10月19日


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

目次

変数を扱う

変数を作る

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

定数を扱う

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

定数を使う

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

関数を扱う

関数を作る

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

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

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

関数を変数に代入する

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