- File:
-
- 1 edited
-
doc/papers/concurrency/examples/Fib.cfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/concurrency/examples/Fib.cfa
rb60ed54 r600d7be 13 13 } 14 14 15 #define FibCtor { 1, 0}16 typedef struct { int fn 1, fn; } Fib;17 int fib_state( Fib & f ) with( f) {18 int ret = fn; fn = fn1; fn1 = fn + ret;19 return ret;15 #define FibCtor { 0, 1 } 16 typedef struct { int fn, fn1; } Fib; 17 int fib_state( Fib & f ) with( f ) { 18 int fn0 = fn1 + fn2; fn2 = fn1; fn = fn0; 19 return fn1; 20 20 } 21 21 … … 32 32 coroutine Fib2 { int fn; }; // used for communication 33 33 void main( Fib2 & fib ) with( fib ) { // called on first resume 34 int fn1; // precompute first two states 35 [fn1, fn] = [1, 0]; 34 int fn1 = 1, fn2 = 0; // precompute first two states 36 35 for () { 36 fn = fn1 + fn2; fn2 = fn1; fn1 = fn; // general case 37 37 suspend(); // restart last resume 38 [fn1, fn] = [fn, fn + fn1];39 38 } 40 39 } 41 int ?()( Fib2 & fib ) { // function-call interface40 int ?()( Fib2 & fib ) with( fib ) { 42 41 return resume( fib ).fn; // restart last suspend 43 42 } 44 int ?()( Fib2 & fib, int N ) { // skip N values45 for ( N - 1 ) fib(); // use function-call interface43 int ?()( Fib2 & fib, int N ) with( fib ) { 44 for ( N - 1 ) fib(); 46 45 return fib(); 47 46 } 48 double ?()( Fib2 & fib ) { // different return type49 return (int)(fib()) / 3.14159; // cast prevents recursive call47 double ?()( Fib2 & fib ) with( fib ) { 48 return (int)(fib()) / 3.14159; // restart last suspend 50 49 } 51 50
Note:
See TracChangeset
for help on using the changeset viewer.