









[blog]
[ML]
[todo]
[CVS]
[bug]
[apache log]
[swiki log]
[statistics]
[map]
[man]
[info]
[アンテナ]
Squeakのブロック
ブロックです。
他のC言語やJavaではなじみのないものかもしれませんが、強力な言語機能です。
なんていうか、LISPのλ式みたいなものだと(私は)思っています。
Rubyな人の場合、do ... end あるいは {}内のものと考えていいんじゃないかな?
Perlな人の場合は、eval()と考えてください。
- ちょっと脱線ですが、最近のPerlは無名手続きオブジェクトを生成できますよ。こんな感じです。–SHIMADA
$addone = sub { return @_[0] + 1; };
print $addone->(4);
=> 5
| addone |
addone := [ :i | i + 1].
addone value: 4
=> 5
ブロックは、プログラムの断片みたいなもので、valueのメッセージを受けると、
ブロック内の式が評価されます。
例えば、
とした場合、b valueとすると aに2が加算されます。
また、ブロックには引数を持たすことができ、
- b ← [ :c :d | a ← a+2+c+d]
の場合に b value: 3 value: 4 とすると、仮変数cが3に、仮引数dが4となり、
結果的に、aに2と3(c)と4(d)が加算されます。
また、ブロックの中で↑(^復帰値)を書いた場合には、ブロックを評価しているメソッド
自体が終了します。(ブロックのみ終了するわけではない)
これに注意してください。(Exceptionなどに使うことがあるとのことです)
Squeakでは、#value:valueと#value:value:valueまでをサポートしています。
4つ以上の引数を与える場合、#valueWithArguments:を使い、引数としては配列を
与えます。
ブロックの中で ^ を使うとブロックを評価しているメソッド自体が終了してしまいますが、ブロックの中で処理を中断したいというニーズもあると思います。
SML:ブロックからの非局所脱出
に、ブロックのクラス(BlockContext)に中断できるようなメソッドを追加する話が出てきています。–SHIMADA

Link to this Page