1Kuinの変数定義
Kuinでは、変数を図1-1のように定義します。
var 変数名: 型名
var 変数名: 型名 :: 初期値
ローカル変数の場合、初期値を指定すると、変数が生成されたときにその値が代入されます。
グローバル変数の場合、初期値にはコンパイル時に定数になる値のみが指定でき、プログラムの起動時にその値が代入されます。
初期値を指定しない場合の変数にはデフォルト値が入ります(Kuinの型とリテラルを参照)。
図1-2は、「[]char」型の変数「str」を定義して初期値に「"abcde"」を指定した例です。
- var str: []char :: "abcde"
変数は、関数の外で定義するとグローバル変数となりメモリの静的領域に作成されます。 関数の中で定義するとローカル変数となりメモリのスタック領域に作成されます。 またクラス内で定義するとプロパティ(メンバ変数)となります。
設計の理由
変数定義の書き方はほぼPascalでの書き方と同じです。 行頭で変数定義であることが判断でき、可読性もコンパイル速度も向上するため採用しました。
2Kuinの関数定義
Kuinでは、関数を図2-1のように定義します。
func 関数名(引数名1: 型名1, 引数名2: 型名2, …)
関数の中身
end func
func 関数名(引数名1: 型名1, 引数名2: 型名2, …): 戻り値の型名
関数の中身
end func
例えば、「int」型の引数「a」「b」を取り「bool」型の値を返す関数「f」を定義するときは図2-2のようにします。
- func f(a: int, b: int): bool
- end func
関数をクラス内で定義するとメソッド(メンバ関数)となります。
設計の理由
関数定義の書き方はほぼPascalでの書き方と同じです。 行頭で関数定義であることが判断でき、可読性もコンパイル速度も向上するため採用しました。
2.1関数内関数
関数の中で関数を定義することもできます(図2-3)。
- func f(a: int, b: int): bool
- func g(a: int, b: int): bool
- end func
- end func
ただし、関数内関数には図2-4の制約があります。
- 外側の関数で定義されたローカル変数やme変数にアクセスすることができない。
2.2参照渡し
仮引数の型の前に「&」を付けると、引数に変数の参照が渡る「参照渡し」になります。
参照渡しの引数に変数を渡すときには、実引数の変数の前にも「&」を付ける必要があります(図2-5)。
- func main()
- var x: int
- var y: int
- do f(&x, &y)
-
- func f(a: &int, b: &int)
- do a :: 3
- do b :: 5
- end func
- end func
この例では「f(&x, &y)」を呼び出すと変数xとyの参照が渡り、関数f内でそれぞれ3と5の値が代入されるため、xは3、yは5となります。
また、参照渡しの引数に変数名を書かずに「&」とだけ書くと、自動的に一時変数が作られて渡されます(図2-6)。
- func main()
- do f(&, &)
-
- func f(a: &int, b: &int)
- do a :: 3
- do b :: 5
- end func
- end func
関数の戻り値を参照渡しで返しているとき、それを受け取る必要がない場合にこの記法が便利です。
「&」とだけ書いたときに渡る一時変数の値は、関数呼び出しの直前に型のデフォルト値で初期化されています。