素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

無限リストとFizzBuzz、yield

???㡼???ѿ?(sharp variables) - oct inaoduで、リテラルに循環したオブジェクトを書けることを知ったので、
JSEnumerator –
CodeRepos::Share – Trac
のサンプルのFizzBuzzを、それを使って書き直してみた。

function cycle(list) {
  var ret = [, list];
  while (ret = ret[1]) if (ret)
    yield ret[0];
}

function zip() {
  try {
    for (;;) {
      var ret = [];
      for (var i = 0;i < arguments.length;++i)
        ret.push(arguments[i].next());
      yield ret;
    }
  } catch (error if error instanceof StopIteration) {}
}

function upper(n) {
  for (var i = n;;++i)
    yield i;
}

for (
  var [fizz, buzz, i]
    in
  zip(
    cycle(#1=["", ["", ["Fizz", #1#]]]),
    cycle(#1=["", ["", ["", ["", ["Buzz", #1#]]]]]),
    upper(1))) {
  console.log(fizz + buzz || i);
  if (i >= 100) break;
}