言語ゲーム

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

Twitter: @propella

eToys 改良案

この日記には探せば山ほど企画倒れの eToys システム改良案があるが、懲りずに新たなアイデアを追加する。最初に典型的な eToys 作品を挙げ、その問題点を述べ、改良案を記す。

車の加速


画像は典型的な eToys 作品の一部である。

  • 画面に赤い自動車と、二つのスクリプター、そしてキャプションがある。
  • moveTestTwo の時計ボタンを押すと車が加速しながら走り出す。
  • 画面に軌跡を描く。reset のびっくりボタンを押すとスクリプトは停止し、元の位置へ戻る。

キャプションによって作品の説明がされている。スピードが最初はゼロで、次第に速くなる様子を表現している。

問題点

問題点は、読者から観ての視点を優先して考える。つまり、作者の作りやすさよりも読者の理解しやすさを優先する。

  • 作品によってスクリプト起動の方法が異なる。例えば、moveTestTwo の時計マークが起動で、reset のびっくりマークが初期化だという事が分からない。
  • 注目すべき値 (car's speed や car's x) と従属する値その他もろもろの区別が付かない。
  • speed の定義が表現されていない。
  • 一意なテキスト表現が無いので、このような日記やメールに書きづらい。

改良案

スクリプトは一意なテキスト表現が可能であるとする。以下に架空の言語で示す。

  • いくつかのスクリプト名はあらかじめ決まっている。初期化には必ず onInitialize が呼ばれ、スタートボタンを押すと onStart、実行中は onTick が呼ばれる。これにより読者がスクリプトの意味を迷う事が無い。
  • グラフィック表現を持たないオブジェクト(NumberHolder) がある。NumberHolder は MVC で言う所のモデルを表現する。作品中で注目すべき値を表現するのに使われる。
  • 型を明示する。型は定義時に決定され、スクリプト内で変更出来ない。これは Smalltalk と eToys の大きな違いだが、テキスト表現する方法が無かった。これを表現する為に := (代入構文) と ValueHolder のサブクラスを使う。ValueHolder はインスタンス変数を一つだけ持つオブジェクトで、数値や文字列、閾値制限、集合からの選択(ペンの種類等)等の設定を行う。
  • スクリプト内での値の「代入」は <- を使う。<- は value: 等のセッターとして解釈される。つまり、箱の中身は変わるが箱自体は変わらない。実行時及び編集時型チェックが行われる。
  • スクリプトにはテキスト表現とグラフィック表現がある。テキスト表現は一つのテキストで表現可能である。スクリプトの実行順序(複数の onTick 等) はテキスト表現の順序に依存する。[] で囲まれない地の文はグラフィック表現が無い。
  • オブジェクトは標準でグローバル変数にアクセスする事は出来ない。GUI 上で自由にアクセス出来るモードがあっても良いが、内部的にはどのオブジェクトがどのオブジェクトを参照しているか明示的に記録される。
"定義文。ビューワ等の操作から自動生成される。"

Speed := NumbeHolder clone. "NumberHolder は数値を入れる事の出来る非表示オブジェクト。"
X := NumberHolder clone.
Car := Player from: 'xxx.png'. "Player は画像オブジェクト。"
Car knows: {Speed. X}. "Car は指定した変数にしかアクセス出来ない"

"実行文。スクリプタ操作から生成される。"

Speed onTick := [Speed <- Speed + 30].

X onTick := [X <- X + Speed].

Car onTick := [
  Car x <- X + 100.
  Car y <- 100.
].

Car onStart := [
  X <- 0.
  Speed <- 0.
  Car clearAllPenTrail.
].

Car onInitialize := [
  Car trailStyle <- #dots.
  Car penDown <- true.
  Car x <- 100.
  Car y <- 100.
]