コルーチンの概要
Squirrelはコルーチンをサポートしています。コルーチンをサポートしている言語は少ないので、その意味を知っている人は少ないかもしれません。
コルーチン(co-routine)とは関数の途中で処理を中断して制御を戻し、また中断途中から処理を再開できる仕組みのことです。
通常の関数は頭から処理を始め、途中でリターンするか、関数の終わりまで処理を続けます。 そしてまた同じ関数が呼ばれても当然、頭から処理を開始します。
それに対して、コルーチンは途中で制御を戻しても、次に実行されるときは前に中断した箇所から処理を開始することが出来るのです。
ちなみにコルーチンは協調的マルチスレッドとも呼ばれています。
コルーチンの例
それではコルーチンのサンプルコードを見ていきましょう。
// コルーチン function func() { print("コルーチン開始"); // 処理を中断(1回目); yield "処理を中断1"; print("ここから再開"); // 処理を中断(2回目); yield "処理を中断2"; print("次はここから再開"); return "コルーチン終了"; } // コルーチンを作成 local co = func(); // 1回目呼出し print(resume co()); print("----------------------"); // 2回目呼出し print(resume co()); print("----------------------"); // 3回目呼出し print(resume co());
yield
コルーチンの仕組みである途中で中断をするには yield関数を使用します。
yieldの引数には呼出しもとに返す値を指定することが出来ます。
コルーチンの作成
コルーチンとして定義した関数は普通に呼び出すだけでは正常に動作しません。
コルーチンとして動作させるためにはまず、変数に代入します。
resume
後は作成したコルーチンオブジェクトをresumeを使って呼出しをすればOKです。
サンプルを実行すれば大体の動きが掴めると思います。