Top/マニュアル/基本/関数
  トップページへ   [ 一覧 | 検索 | 最終更新 ]   [ 差分 | 履歴 ]

#author("2021-11-21T04:59:55+09:00","","")
#author("2021-11-23T15:59:55+09:00","","")
#navi(マニュアル/基本)

*関数 [#n5a1e946]

#contents
関数名は全角文字も使えます。

また、変数の定義はローカル、グローバル問わず関数内でしかできないことに注意してください。
*基本 [#taf16c8e]

#code(aya,nooutline,nolink,nonumber){{
Test{
 "Hello World!"
}
}}

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

つまり
#code(aya,nooutline,nolink,nonumber){{
Test{
 _A = 10
 _B = 11+32 
 "Hello World!"
}
}}
としても、返り値は"Hello World!"となります。
また、

#code(aya,nooutline,nolink,nonumber){{
Test{
 A = 10
 "Hello World!"
 "Hallo Welt!"
 10
 11+32
}
}}

のように返り値の候補が複数存在すると、それらのうちいずれかがランダムで選ばれます(この例では"Hello World!", "Hallo Welt!", 10, 43)。

また、中括弧は
#code(aya,nooutline,nolink,nonumber){{
Test
{
 "Hello World!"
 "Hallo Welt!"
}
}}
のように書いても構いません。

*引数 [#n5a1e946]
関数には引数を与えることができます。このとき受け取った引数はローカル変数の配列_argvに書格納され、_argcに引数の数(_argvのサイズ)が格納されます。 

例えば
#code(aya,nooutline,nolink,nonumber){{
てすと{
 "入力は「"+_argv[0]+"」だよ"
}
}}
という関数を定義し、
#code(aya,nooutline,nolink,nonumber){{
てすと("うかがか")
}}
のように実行すると、"入力は「うかがか」だよ"が出力されます。

*自身の関数名 [#o45f5801]
ローカル変数 _FUNC_NAME_ には現在実行中の関数名が入ります。~
各種の動的定義命令([[APPEND_RUNTIME_DIC>マニュアル/関数/APPEND_RUNTIME_DIC]]など)の拡充に伴い、利便性のために追加されました。

*変数の定義 [#n5a1e946]
関数内では自由に変数を宣言することができます。このとき変数名が"_"からはじまるものはローカル、そうでないものはグローバル変数として扱われます。
***ローカル変数 [#b6493b63]
その変数が定義された中括弧内でしか使えない変数です。
***グローバル変数 [#d08d255a]
関数が実行されて一度定義されてしまうと、どこでも使える変数になります。~
なお、グローバル変数はゴーストを終了しても保持されます。消去したい場合は[[ERASEVAR>マニュアル/関数/ERASEVAR]]関数を使う必要があります。
#code(aya,nooutline,nolink,nonumber){{
テスト2{
 _aa = 200//これはローカル
 bb = 200//これはグローバル
}
}}
その関数内でしか使わない変数などは、なるべくローカル変数を使うようにしたほうがバグが出にくくなります。たとえばループ処理のラベルなどでは
#code(aya,nooutline,nolink,nonumber){{
テスト2{
 for _i = 0; _i <10; _i++{
  _i+"\n"
 }
}
}}
のようにローカル変数(_i)を使ってください。

*呼び出し回数制限 [#v79f5ca7]

[[基礎設定ファイルのfncdepth>マニュアル/文法/1.基礎設定#p6bb4967]] で関数の呼び出し深さ(回数ではない)の設定ができます。標準は32階層です。~
制限に到達した時は shiori.OnCallLimit(関数名,行) が呼ばれます。
制限に到達した時は shiori.OnCallLimit(関数名,行) が呼ばれます。~
実行中にメモリを使い果たした時は shiori.OnMemoryLimit() が呼ばれますが、スタックオーバーフローを捉えることはできません。

#navi(マニュアル/基本)