好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

generator は foreach で使うことを考えて書くこと

最初の方に書いたソースが全然考えてなくてしょんぼりだったので、自戒をこめて。

function times(num) {
  for (local i = 0; i < num; ++i) {
    yield i
  }
}

foreach(i in times(3)) {
  print(i+"\n")
}

だと

0
1
2
(null : 0x00000000)

と出力されてしまうから

function times(num) {
  for (local i = 0; i < num-1; ++i) {
    yield i
  }
  return num-1
}

foreach(i in times(3)) {
  print(i+"\n")
}

と書いて

0
1
2

こう出力されるようにするべきだよなーと。


複数の generator を回すときはこんなんで

local g1 = times(100)
local g2 = times(200)

for(;;) {
  // どちらかが dead になったら break
  try {
    resume(g1)
    resume(g2)
  } catch (e) {
    break
  }
}

毎回 generator.getstatus() != "suspended" とかするより例外ひろった方が速い*1Squirrel だと文字列比較で、C 実装は数値でみて例外投げてる分の違い?

*1:少なくとも私の環境では