Kuina-chan

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


プログラミング言語Kuin」の言語仕様4、変数と関数についてです。

1Kuinの変数定義

Kuinでは、変数を表1-1のように定義します。
表1-1: 変数定義

var 変数名: 型名

var 変数名: 型名 :: 初期値

ローカル変数の場合、初期値を指定すると、変数が生成されたときにその値が代入されますが、初期値を省略することもできます。 ローカル変数以外では初期値は指定できません。
図1-1は、「[]char」型の変数「str」を定義して初期値に「"abcde"」を指定した例です。
  1. var str: []char :: "abcde"
図1-1: 変数定義の例
初期値を指定しない場合の変数にはデフォルト値が入ります(Kuinの型とリテラルを参照)。
変数は、関数の外で定義するとグローバル変数となりメモリの静的領域に作成されます。 関数の中で定義するとローカル変数となりメモリのスタック領域に作成されます。 またクラス内で定義するとプロパティ(メンバ変数)となります。
設計の理由

変数定義の書き方はほぼPascalでの書き方と同じです。 行頭で変数定義であることが判断でき、可読性もコンパイル速度も向上するため採用しました。

2Kuinの関数定義

Kuinでは、関数を表2-1のように定義します。
表2-1: 関数定義

func 関数名(引数名1: 型名1, 引数名2: 型名2, )
    関数の中身
end func

func 関数名(引数名1: 型名1, 引数名2: 型名2, ): 戻り値の型名
    関数の中身
end func

例えば、「int」型の引数「a」「b」を取り「bool」型の値を返す関数「f」を定義するときは図2-1のようにします。
  1. func f(a: int, b: int): bool
  2. end func
図2-1: 関数定義の例
関数をクラス内で定義するとメソッド(メンバ関数)となります。
設計の理由

関数定義の書き方はほぼPascalでの書き方と同じです。 行頭で関数定義であることが判断でき、可読性もコンパイル速度も向上するため採用しました。

2.1関数内関数



関数の中で関数を定義することもできます(図2-2)。
  1. func f(a: int, b: int): bool
  2.   func g(a: int, b: int): bool
  3.   end func
  4. end func
図2-2: 関数内関数を定義する例
ただし、関数内関数には図2-3の制約があります。
  • 外側の関数で定義されたローカル変数やme変数にアクセスすることができない。
図2-3: 関数内関数の制約

2.2参照渡し



仮引数の型の前に「&」を付けると、引数に変数の参照が渡る「参照渡し」になります。
参照渡しの引数に変数を渡すときには、実引数の変数の前にも「&」を付ける必要があります(図2-4)。
  1. func main()
  2.   var x: int
  3.   var y: int
  4.   do f(&x, &y)
  5.  
  6.   func f(a: &int, b: &int)
  7.     do a :: 3
  8.     do b :: 5
  9.   end func
  10. end func
図2-4: 参照渡しの例
この例では「f(&x, &y)」を呼び出すと変数xとyの参照が渡り、関数f内でそれぞれ3と5の値が代入されるため、xは3、yは5となります。
また、参照渡しの引数に変数名を書かずに「&」とだけ書くと、自動的に一時変数が作られて渡されます(図2-5)。
  1. func main()
  2.   do f(&, &)
  3.  
  4.   func f(a: &int, b: &int)
  5.     do a :: 3
  6.     do b :: 5
  7.   end func
  8. end func
図2-5: 参照渡しの省略
関数の戻り値を参照渡しで返しているとき、それを受け取る必要がない場合にこの記法は便利です。
「&」とだけ書いたときに渡る一時変数の値は、関数呼び出しの直前に型のデフォルト値で初期化されています。
1544537357jaf