[Issue 5660] yield syntax sugar

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Aug 3 05:08:14 PDT 2011


http://d.puremagic.com/issues/show_bug.cgi?id=5660



--- Comment #3 from bearophile_hugs at eml.cc 2011-08-03 05:08:13 PDT ---
Just as an example, this is Python2.6 code:


def process((i, j), a, b):
  if i == 0: yield (a, j)
  if j == 0: yield (i, b)
  if i == a: yield (0, j)
  if j == b: yield (i, 0)
  if j != b: yield (i + j - b, b) if (b < i + j) else (0, i + j)
  if i != a: yield (a, i + j - a) if (a < i + j) else (i + j, 0)



And this is how ShedSkin compiles it to C++ (a bit edited):


class __gen_process : public __iter<tuple2<int, int> *> {
public:
  tuple2<int, int> *__2, *__3;
  int a, b, i, j;

  int __last_yield;

  __gen_process(tuple2<int, int> *__2,int a,int b) {
    this->__2 = __2;
    this->a = a;
    this->b = b;
    __last_yield = -1;
  }

  tuple2<int, int> * __get_next() {
    switch(__last_yield) {
      case 0: goto __after_yield_0;
      case 1: goto __after_yield_1;
      case 2: goto __after_yield_2;
      case 3: goto __after_yield_3;
      case 4: goto __after_yield_4;
      case 5: goto __after_yield_5;
      default: break;
    }
    if ((i==0)) {
      __last_yield = 0;
      __result = (new tuple2<int, int>(2,a,j));
      return __result;
      __after_yield_0:;
    }
    if ((j==0)) {
      __last_yield = 1;
      __result = (new tuple2<int, int>(2,i,b));
      return __result;
      __after_yield_1:;
    }
    if ((i==a)) {
      __last_yield = 2;
      __result = (new tuple2<int, int>(2,0,j));
      return __result;
      __after_yield_2:;
    }
    if ((j==b)) {
      __last_yield = 3;
      __result = (new tuple2<int, int>(2,i,0));
      return __result;
      __after_yield_3:;
    }
    if ((j!=b)) {
      __last_yield = 4;
      __result = (((b<(i+j)))?((new tuple2<int, int>(2,((i+j)-b),b))):((new
tuple2<int, int>(2,0,(i+j)))));
      return __result;
      __after_yield_4:;
    }
    if ((i!=a)) {
      __last_yield = 5;
      __result = (((a<(i+j)))?((new tuple2<int, int>(2,a,((i+j)-a)))):((new
tuple2<int, int>(2,(i+j),0))));
      return __result;
      __after_yield_5:;
    }
    __stop_iteration = true;
  }
};

__iter<tuple2<int, int> *> *process(tuple2<int, int> *__2, int a, int b) {
  return new __gen_process(__2,a,b);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list