Home English

Kuina-chan

くいなちゃんOct 17, 2017


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

Kuinの変数定義

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

 var 変数名: 型名

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

ローカル変数の場合、初期値を指定すると、変数が生成されたときにその値が代入されますが、初期値を省略することもできます。 ローカル変数以外では初期値は指定できません。
変数定義の例は、「[]char」型の変数「str」を定義して初期値に「"abcde"」を指定した例です。
var str: []char :: "abcde"
変数定義の例
初期値を指定しない場合の変数にはデフォルト値が入ります(型とリテラルを参照)。
変数は、関数の外で定義するとグローバル変数となりメモリの静的領域に作成されます。 関数の中で定義するとローカル変数となりメモリのスタック領域に作成されます。 またクラス内で定義するとプロパティ(メンバ変数)となります。
設計の理由
 変数定義の書き方はほぼPascalでの書き方と同じです。 行頭で変数定義であることが判断でき、可読性もコンパイル速度も向上するため採用しました。

Kuinの関数定義

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

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

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

例えば、「int」型の引数「a」「b」を取り「bool」型の値を返す関数「f」を定義するときは関数定義の例のようにします。
func f(a: int, b: int): bool
end func
関数定義の例
関数をクラス内で定義するとメソッド(メンバ関数)となります。
設計の理由
 関数定義の書き方はほぼPascalでの書き方と同じです。 行頭で関数定義であることが判断でき、可読性もコンパイル速度も向上するため採用しました。

関数内関数

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

参照渡し

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