ブロックとは

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

ブロックはメソッドを折りに詰めてお持ち帰り可能にしたもの、みたいに捉えれば良さそうだけど、よくわからないので、あとで試して例示。