はじめる! Squirrel 第8章 高度な話題 その2

  • 協調動作
    • スレッドとジェネレータ
    • ジェネレータは yield 文を含む関数。呼び出すとジェネレータが返る
      • yield したらそこで処理が中断される。yield に渡した値がジェネレータの resume から取得できる
      • ジェネレータは resume で再開できる
      • 最初に走りはじめるのにも resume が必要
      • ということは yield の有無は静的に解釈されているので、実際には一度も yield を呼ばないものでもジェネレータになる
function g() {
  if ( false ) {
    yield 42;
  }
}

local val = g();    // => ジェネレータが返る
print (resume val); // => (null : 0x0x0)
      • foreach 文にジェネレータを渡すと yield した値でループできる
    • スレッド - 協調スレッド
      • プリエンプティブな切り替えは起きないので Ruby の Fiber みたいなものですね
      • ジェネレータと似ている。スタック、グローバルテーブル、エラーハンドラを独立して持っているというところが違う
        • グローバルテーブルが異なるということは名前空間も別になるんですかねー
      • newthread ビルトイン関数で生成する
        • 生成直後はアイドル状態で、メンバ関数 call を呼ぶことで実行を開始する
      • スレッドは suspend 文で中断する

中途半端ですが、今年の朝読書はこれで終わりです。
今年は「抽象によるソフトウェア設計」の練習問題にはじまり、「Webを支える技術」「サーバ/インフラを支える技術」「データマイニングの基礎」「はじめる! Cucumber」「はじめる! Squirrel」などを読みました。 Web系と分析の話が多めでしたね。来年も粛々と積読を消化したいと思います。