ブロック

ブロックの概念

mongooseでは、関数呼び出し時のブロックイベントハンドラとして扱われます。
ブロックは、呼び出された際に、必ず規定の引数$resultを受け取ります。
与えられた回数分繰り返す組み込み関数loopを例にとってみます。
例:

# 1 ~ 10までの数字を表示
loop(10){              # 10回繰り返し
    $result++;         # $resultloopから渡される現在の繰り返し回数(0~)を、+1
    print($result);    # printは与えられた値を文字列にして表示。
}


イベント発行の方法

定義した関数から、ブロックを呼び出すには、wakeup()を利用します。
wakeup()は、呼び出し元でブロックが定義されていなければ、何もせずに戻ります。
例:

# イベント発行だけをするユーザ関数
function do_event(){
wakeup("arg1", "arg2");  # イベント発行。(引数でイベントハンドラに渡す値を指定する)
}

# 関数呼び出し(イベントハンドラ無し)
do_event();
# 関数呼び出し(イベントハンドラ有り)
do_event(){
println($result[0]);         // arg1が表示される
println($result[1]);         // arg2が表示される
println("イベントが発行されました。");
}


ブロック内での変数のスコープ

ブロックは、呼び出し先の関数を親に持ち、親の親までの変数を参照することが出来ます。
例:

function do_event(){
wakeup();            # イベント発行。(引数でイベントハンドラに渡す値を指定する)
}
A = 1;               # 変数Aに1を代入
do_event(){          # 関数呼び出し
print(A);        # ここではAを参照可能(表示は1)
B = 2;           # 変数Bに2を代入
C = A;           # 変数Cに変数Aの値を代入
do_event(){      # 関数呼び出し
    print(A);    # ここではAが参照不可(表示はnull)
    print(B);    # Bは参照可能(表示は2)
    print(C);    # Cは参照可能(表示は1)
}
}


ブロックのライフタイム

ブロックは、関数呼び出し時に作成され、関数呼び出しが終了するまで生き続けます。
イベント発行の度に作成されるわけではありません
ブロック内で設定した変数の値は、次回のイベント発行時に引き継がれます。