ブロックとは
http://iolanguage.com/scm/git/checkout/Io/docs/IoGuide.html#Objects-Blocksより。
ブロック
ブロックは変数のスコープの違いを除いて、メソッドと同じです。つまり変数検査は、ブロックが実行されるメッセージのターゲットの代わりに、ブロックが生成された時点での文脈に従います。。ブロックはObjectのblock()メソッドで生成できます。例:
b := block(a, a + b)ブロック vs メソッド
混乱の種になりそうなので、詳細を説明します。
両方とも、呼び出されるとローカル領域にオブジェクトを作成するのは同じですが、そのローカル領域のオブジェクトの"proto"と"self"スロットに何がセットされるかが違います。メソッドでは、メッセージのターゲットがセットされます。ブロックでは、そのブロックが作成された時点でのローカル領域のオブジェクトがセットされます。実行中に変数がローカル領域で見つからない場合、そのメッセージを呼び出したオブジェクトを辿って検索されます。callとselfスロット
ローカル領域にオブジェクトが作られる際、そのselfスロットには、メソッドの場合はメッセージのターゲット、ブロックの場合は生成時の文脈に沿ってセットされ、callスロットにはCallオブジェクトがセットされ、ブロック実行時のアクセス情報が参照できます:
slot returns call sender 呼び出し側のローカルオブジェクト call message 呼び出し時に使われたメッセージ call activated 実行されたメソッドまたはブロック call slotContext スロットが見つかった文脈 call target カレントオブジェクト
メッセージのターゲットとは、そのメッセージを持つオブジェクトの様子。下記コードでは、1行目ではLobbyが、2行目ではhogeがターゲットとなる。
Io> a := 1 Io> hoge a := 2
ブロックはメソッドを折りに詰めてお持ち帰り可能にしたもの、みたいに捉えれば良さそうだけど、よくわからないので、あとで試して例示。