監督
四つのパネルがそれぞれの速さで数を刻んでいる画面です。入力欄が一つあり、パネルごとに crash ボタンが付いています。
見てほしい順番
まず四つの数を見ます。 それぞれ別のタイマーで動いていますが、変わった数だけが光ります。光っているのは、描き直しが実際に触った要素です。あるパネルが刻んでも、隣のパネルは描き直されません。パネルを囲んでいる枠も描き直されません。
次に入力欄に何か打ちます。
最後に、どれかの crash を押します。 そのアクタはエラーで止まります。監督役がそれを受け取り、決まった状態から作り直し、再起動の回数を数えます。打ちかけの文字も、他の三つの数も、そのタイマーも、何も影響を受けません。
落としたときに何が起きているか
パネルのアクタが止まると、監督役に down: が届きます。監督役はそれを受け取り、そのパネルを作り直して、再起動の回数を一つ増やします。落ちたことはメッセージで届き、復旧は普通のハンドラです。
止まったのはそのアクタだけです。他の三つのパネルは自分の状態とタイマーを持ったまま動き続け、入力欄の文字も残ります。
Wall >> start = ( me monitor: panel. self ).
Wall >> down: d = self with: {
panels: panels copyWith: (me spawn: (Panel label: d actor name)).
restarts: restarts + 1 }.隣のパネルが描き直されない理由
親のアクタが持っているのは、子アクタへの参照です。参照は変わらないので、親を描き直しても子には降りていきません。
これは書き忘れられる種類の最適化ではありません。memo を付けたかどうかではなく、参照が変わっていないという事実です。
マークアップはデザイナのものです。パネルは、デザイナが壁に一つ置いた見本を複製しています。