毛玉

いまいち集中していないのだが、Tweak版毛玉。Andreasと並列言語のセマンティクスについてちょっと意見交換をしつつ、クラス定義が変わったときの処理を実装。

毛玉の場合、基本的には、ひとつの種類のタートルを定義すると、内部的には(今は3つ、だけど将来は4つ)のPlayerクラスを作る。それぞれは、Exemplarとしての振る舞い、集合としての振る舞い、直列実行するときの振る舞い、タートルの変数に格納されたときの振る舞いを記述するためにある。これらのうち、ユーザーが実際に操作するExemplarを他のものの親クラスとするので、ユーザー定義のスクリプトコンパイルしたCompileMethodは親クラスに定義するだけで、子クラス達からも呼べるわけである。

Tweakの場合は、Uniclassのインスタンスの定義を変えたときには、さっさと新しいUniclassを作ってしまい、そのインスタンスのクラスを(class pointerを張り替えることによって)新しいUniclassに替える。そこに継承関係がなければそれで良いのだが、毛玉のように継承関係をつけようとしている場合には、もともとの子クラスのインスタンスには知らされないまま、友達だと思っていたやつのクラスが変わってしまうことになる。もちろん、例えばExemplarに新しく定義されたはずのメソッドも呼ぶことができない。

これを回避するために、Tweakのイベントモデルを使う。メソッド定義が変更されたときやインスタンス変数が追加されたときにはイベントが発生するので、そのイベントのイベントハンドラーを書いておき、実行時に必要な情報を組にしたイベントを発生させれば、関連するインスタンスたちにその情報が伝わり、彼らも自分のクラスを変えて親子関係をとりもどすことができる。

Tweakのイベント良いです。C++フレームワークであるQtのイベントモデルにも似ているのですが、メタプログラミングでもどんどん使えますし、例によってクラスをインスペクターで開きつつ、デバッガで追いつつプログラムが書けますので。eToys版のときのやったように、闇雲にPlayerクラスのメソッドをオーバーライドする必要もないです。