func定義と呼び出し

基本

func キーワードで関数を定義します。

func greet(name) {
    return "こんにちは、" + name + "。"
}

OnBoot => {
    湊: ${greet("湊")}
}

引数なし

func random_greeting() {
    if (rand() % 2 == 0) {
        return "こんにちは。"
    }
    return "やあ。"
}

OnBoot => {
    湊: ${random_greeting()}
}

複数の引数

func add(a, b) {
    return a + b
}

OnBoot => {
    湊: ${add(3, 5)}です。
}

グローバル変数の操作

関数の中から global でsaveを操作できます。

func increment(key) {
    global save[key] += 1
}

OnBoot => {
    increment("訪問回数")
    湊: ${save.訪問回数}回目です。
}

定義場所

関数は、基本的にトークの外(トップレベル)に定義します。 トップレベルの関数は、読み込み時に登録され、どのトークからも呼べます。 include で別ファイルに分けることもできます。

トークの中で定義する

func は、トークやブロックの中でも書けます。

OnBoot => {
    func hi(n) {
        return "hi " + n
    }
    湊: ${hi("a")}
}

ただし、トークの中の func は、その行が実行されたときに登録されます。 また、一度登録された関数は、そのトークの中だけでなく、以降は他のトークからも呼べるようになります(ゴーストを終了するまで残ります)。

  • 定義の行が実行される前に呼ぶと、その関数はまだ存在しないので、呼び出しの結果は空になります。
  • 同じ名前の関数を別のトークで定義すると、あとから実行されたほうで置き換わります。
  • 呼ぶ側のトークで名前が見つからない場合の確認には、talk_exists("名前") が使えます。

トークの中だけで使うつもりの関数が、他のトークから見えてしまうことがあるので、特別な理由がなければトップレベルに定義してください。

再帰

再帰呼び出し(関数が関数を呼ぶ入れ子)は、深さ約100が上限です(正確には、最初の呼び出しから数えて101段目までです)。 上限を超えた呼び出しは実行されず、空の値になります。