#include #include int fn1, fn2, state = 1; int fib_gvar() { int fn; choose ( state ) { case 1: fn = 0; fn1 = fn; state = 2; case 2: fn = 1; fn2 = fn1; fn1 = fn; state = 3; case 3: fn = fn1 + fn2; fn2 = fn1; fn1 = fn; } return fn; } #define FibCtor { 0, 1 } typedef struct { int fn, fn1; } Fib; int fib_state( Fib & f ) with( f ) { int fn0 = fn1 + fn2; fn2 = fn1; fn = fn0; return fn1; } coroutine Fib1 { int fn; }; // used for communication void main( Fib1 & fib ) with( fib ) { // called on first resume fn = 0; int fn1 = fn; suspend(); fn = 1; int fn2 = fn1; fn1 = fn; suspend(); for () { fn = fn1 + fn2; fn2 = fn1; fn1 = fn; suspend(); } } int ?()( Fib1 & fib ) with( fib ) { return resume( fib ).fn; } coroutine Fib2 { int fn; }; // used for communication void main( Fib2 & fib ) with( fib ) { // called on first resume int fn1 = 1, fn2 = 0; // precompute first two states for () { fn = fn1 + fn2; fn2 = fn1; fn1 = fn; // general case suspend(); // restart last resume } } int ?()( Fib2 & fib ) with( fib ) { return resume( fib ).fn; // restart last suspend } int ?()( Fib2 & fib, int N ) with( fib ) { for ( N - 1 ) fib(); return fib(); } double ?()( Fib2 & fib ) with( fib ) { return (int)(fib()) / 3.14159; // restart last suspend } int main() { for ( 10 ) sout | fib_gvar(); sout | nl; Fib f1 = FibCtor, f2 = FibCtor; for ( 10 ) sout | fib_state( f1 ) | fib_state( f2 ); sout | nl; Fib1 f1, f2; for ( 10 ) sout | f1() | f2(); sout | nl; Fib2 f12, f22; for ( 10 ) sout | (int)f12() | (double)f12() | f22( 2 ); } // Local Variables: // // tab-width: 4 // // fill-column: 120 // // compile-command: "cfa Fib.cfa" // // End: //