Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/papers/concurrency/examples/Fib.cfa

    rb60ed54 r600d7be  
    1313}
    1414
    15 #define FibCtor { 1, 0 }
    16 typedef struct { int fn1, 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 }
     16typedef struct { int fn, fn1; } Fib;
     17int fib_state( Fib & f ) with( f ) {
     18        int fn0 = fn1 + fn2;  fn2 = fn1;  fn = fn0;
     19        return fn1;
    2020}
    2121
     
    3232coroutine Fib2 { int fn; };                                             // used for communication
    3333void 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
    3635        for () {
     36                fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;  // general case
    3737                suspend();                                                              // restart last resume
    38                 [fn1, fn] = [fn, fn + fn1];
    3938        }
    4039}
    41 int ?()( Fib2 & fib ) {                                                 // function-call interface
     40int ?()( Fib2 & fib ) with( fib ) {
    4241        return resume( fib ).fn;                                        // restart last suspend
    4342}
    44 int ?()( Fib2 & fib, int N ) {                                  // skip N values
    45         for ( N - 1 ) fib();                                            // use function-call interface
     43int ?()( Fib2 & fib, int N ) with( fib ) {
     44        for ( N - 1 ) fib();
    4645        return fib();
    4746}
    48 double ?()( Fib2 & fib ) {                                              // different return type
    49         return (int)(fib()) / 3.14159;                          // cast prevents recursive call
     47double ?()( Fib2 & fib ) with( fib ) {
     48        return (int)(fib()) / 3.14159;                                          // restart last suspend
    5049}
    5150
Note: See TracChangeset for help on using the changeset viewer.