| [747] コルーチンについて
投稿者:レスター 投稿日:2008/07/08(Tue) 16:10:04 |
|
 |
はじめまして。 神話万象をプレイして以来、このサイトを拝見させていただいている者です。
04/17の日記「とんでもマクロ」に書かれているコルーチンに興味があります。 コルーチンを知ったのがつい最近なのですが、これは凄く便利なのでは?と思いました。 よろしければ、STEP_IFとSTEP_WHILEの実装も見せていただけないでしょうか? |
| |
 | |
Re: コルーチンについて 投稿者:管理人:大橋 - 2008/07/10(Thu) 23:22:15  自信を持って晒せるコードでもないのですが、IF と WHILE ではスタックを使っています。
// 分岐 #define STEP_IF(x) \ } \ if (x) { \ event_state = STATE_NEXT_1; \ } else { \ event_state = STATE_JUMP_B; \ } \ } \ PushBack(&begin_stack, STATE_JUMP_B); \ PushBack(&end_stack, STATE_JUMP_E); \ if (event_state == STATE_NEXT_1) {
#define STEP_ELSE() \ event_state = GetBack(&end_stack); \ } else if (event_state == GetBack(&begin_stack)) {
#define STEP_ENDIF() \ event_state = GetBack(&end_stack); \ } \ if (event_state == GetPopBack(&begin_stack) \ || event_state == GetPopBack(&end_stack)) { \ {
// 繰り返し #define STEP_WHILE(x) \ } \ event_state = STATE_NEXT_1; \ } \ PushBack(&begin_stack, STATE_NEXT_1); \ PushBack(&end_stack, STATE_JUMP_E); \ if (event_state == GetBack(&begin_stack)) { \ if (x) { \ event_state = STATE_NEXT_2; \ } else { \ event_state = GetBack(&end_stack); \ } \ } if (event_state == STATE_NEXT_2) {
#define STEP_ENDWHILE() \ event_state = GetBack(&begin_stack); \ } \ GetPopBack(&begin_stack); \ if (event_state == GetPopBack(&end_stack)) { \ { |
| |
 | |
Re: コルーチンについて 投稿者:レスター - 2008/07/11(Fri) 21:49:58 ありがとうございます。 スタックを使って入れ子を実現しているのですね。 とても参考になりました。 私も、こういう複雑なメタプログラミングを考えられる頭がほしいです。
気になった点があるのですが、 まず、日記のSTEP_ENDは}が1つ足りない気がするのですが、これは誤植ですよね? あと、IF/WHILEともに、状態にSTATE_NEXT_1を代入したあとの}と、ENDIF/ENDWHILEの最後の{が1つずつ多いと思いました。 STEP_TOP() Hoge1(); STEP_WHILE() Hoge2(); STEP_END() という使い方を考えていたのですが、使い方が間違っているのでしょうか? |
| |
 | |
Re: コルーチンについて 投稿者:管理人:大橋 - 2008/07/12(Sat) 00:37:23  あ、下記のように使います。
STEP_TOP () { STEP_IF (hoge) { : } STEP_ELSE() { : } STEP_ENDIF() } STEP_END();
{} でちゃんと入れ子にしておかないと、後で読みにくいのでこのようにしました。 |
| |
 | |
Re: コルーチンについて 投稿者:レスター - 2008/07/12(Sat) 01:29:30 なるほど、理解しました。 |
|