2024年12月08日くいなちゃん


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

1Kuinの変数定義

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

var 変数名: 型名


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

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

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

2Kuinの関数定義

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

func 関数名(引数名1: 型名1, 引数名2: 型名2, )

    関数の中身

end func


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

    関数の中身

end func

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

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

2.1関数内関数



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

2.2参照渡し



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