ポジティブ・フィードバック

昨日の講義録http://d.hatena.ne.jp/squeaker/20050505#p3は、"If you are the smartest person in the room, you are in the wrong room."のところが多くの人の琴線に触れた^^;ようで、警句としてリンクが張られている。せっかく書いたのでありがたいことだが、あくまでも「良いコミュニティ」に属したり作って誰も"the smartest"にならないようにするのが重要、ということの振りだった、ということでよろしくお願いします。

はてなブックマークの見出し(http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/squeaker/20050505%23p3)を見るとAlanの言葉みたいに見えますが、彼はあくまでも引用していただけです。が、誰の言葉といったのか実はメモが取りきれなかったのですが、案外James Watsonの言葉と言いつつAlan流にアレンジしたものだったかもしれないので油断はならないわけですが。

もっとも、http://d.hatena.ne.jp/squeaker/20050124#p5に書いたように、格言は文脈を無視して抜き出しても意味があるからこそ生き残るのかとも思いますが。

日記のエントリが参照されるかどうかということには、運良くちょっとリンクされるとあちこちにぱっと広まっていくと言うポジティブフィードバックがあります。が、一方AmazonLong Tail論のように「一見メジャーでなくても積分すればメジャーになる(超訳ですが)」というものもあります。僕の日記は完璧マイナーなほうだけど、存在していることくらいは知っている人は知っている、という状況でまあ丁度良いかなと思っています。

毛玉

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

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

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

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

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