監督

四つのパネルがそれぞれの速さで数を刻んでいる画面です。入力欄が一つあり、パネルごとに 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 を付けたかどうかではなく、参照が変わっていないという事実です。

マークアップはデザイナのものです。パネルは、デザイナが壁に一つ置いた見本を複製しています。