コンテンツにスキップ

関数

関数名には全角文字も使える。

基本的な関数定義

Test{
  "Hello World!"
}

この Test 関数は文字列 "Hello World!" を出力する。YAYA の特徴として、代入式でないただの変数や文字列(この例における "Hello World!")が存在すると、それが返り値として扱われる。

つまり

Test{
  _A = 10
  _B = 11+32
  "Hello World!"
}

としても、返り値は "Hello World!" になる。

中括弧は次のように書いてもよい。

Test
{
  "Hello World!"
  "Hallo Welt!"
}

複数の返り値候補

返り値の候補が複数あると、それらのうちいずれかがランダムで選ばれる。

Test{
  A = 10
  "Hello World!"
  "Hallo Welt!"
  10
  11+32
}

この例では "Hello World!"、"Hallo Welt!"、10、43 のどれかが返る。

引数

関数には引数を与えられる。受け取った引数はローカル変数の配列 _argv に格納され、_argc に引数の数(_argv のサイズ)が格納される。

てすと{
  "入力は「" + _argv[0] + "」だよ"
}

という関数を定義し、

てすと("うかがか")

のように実行すると、"入力は「うかがか」だよ" が出力される。

自身の関数名

ローカル変数 _FUNC_NAME_ には、現在実行中の関数名が入る。各種の動的定義命令(APPEND_RUNTIME_DIC など)の拡充に伴い、利便性のために追加された。

変数の定義

関数内では自由に変数を宣言できる。変数の定義はローカル・グローバルを問わず、関数内でしかできない。変数名が _ から始まるものはローカル変数、そうでないものはグローバル変数として扱われる。

種類 名前 スコープ
ローカル変数 _ で始まる 定義された波括弧内のみ
グローバル変数 _ で始まらない 関数が実行されて一度定義されると、どこでも使える。ゴーストを終了しても保持される

グローバル変数を消去したい場合は ERASEVAR 関数を使う必要がある。

テスト2{
  _aa = 200  // これはローカル
  bb = 200   // これはグローバル
}

その関数内でしか使わない変数などは、なるべくローカル変数を使うようにしたほうがバグが出にくくなる。たとえばループ処理のカウンタには、次のようにローカル変数(_i)を使うこと。

テスト2{
  for _i = 0; _i < 10; _i++
  {
    _i + "\n"
  }
}

呼び出し回数制限

基礎設定ファイルの fncdepth で、関数の呼び出し深さ(回数ではない)を設定できる。標準は 32 階層。

制限に到達したときは shiori.OnCallLimit(関数名, 行) が呼ばれる。実行中にメモリを使い果たしたときは shiori.OnMemoryLimit() が呼ばれるが、スタックオーバーフローを捉えることはできない。

関連