言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

双方向制約
課題: ハンドルを回すと車が動く。車が動くとハンドルが回る。
制約はモルフに依存する必要がある。(双方依存になってしまう!)
なにが変更されたのかをシンプルに知る手段は何か?
一方向の依存を双方向に変換する仕組みが必要。

双方向制約と step の正確な記述。

要求:
a, b の二つの間に a = f b という制約が存在し、
優先する操作 a := c が実行された場合。
有限の時間で制約
1: a = f b は必ず満たす
2: a = c は出来るだけ満たす。
1,2 を同時に満たす解がある場合は出来るだけ同時に満たす。

解決:
この場合では、単位時間ごとに
1: a := c
2: a := f b
1: a := c
2: b := (f^-1) a
を実行すれば良い。1 の操作はUIスレッドが勝手にやってくれる事を想定している。

無理矢理 ThingLab の例をやってみる。
中点の表現
c := (a + b) / 2
2 * c := a + b
a := c * 2 - b
a := -b + c * 2
b := -a + c * 2

かなり予期しない動きをしてしまう。
2引数以上のメソッドを作る。

  • SqueakToys に 2 引数以上のメソッドを追加してみる
    • メソッドの編集に対しては、ScriptEditorMorph が責任を持っている。ScriptEditorMorph>>addParameter で引数の追加。
    • 引数の追加とは、新しいメソッド名を生成して追加、元のメソッドを削除する事。
    • 新しくコンパイルする際に、引数の数に応じてメソッドパタンを作成する必要がある。ScriptEditorMorph>>methodString
  • SqueakToys の最後の式の値を返すようにする。