関数¶
関数名には全角文字も使える。
基本的な関数定義¶
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() が呼ばれるが、スタックオーバーフローを捉えることはできない。