言語ゲーム

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

Twitter: @propella

プレゼンツール

要求

アランさんに注文されたのは二点。

  • 次へボタンを押すと、次のページに行くだけじゃなくて、あるアクションが出来るように(文字や絵を出したり消したり)。
  • BookMoprh を画面に出しながらページの並べ替え(Sorter)が出来る。

問題の記述

最初の物を実現するために、阿部さんの、etoys による etoys 実装の考えを使う。例えばページ1に移動するボタン、ページ2に移動するボタン等等、を作って入れ物に入れる。その入れ物の要素を順に fire していくスクリプトを作れば、それは次へボタンと同じ意味になる。さらにその入れ物の中には移動ボタンだけじゃなくて、テキストを表示したり消したりするボタンを入れる事になるので、基本的な要求を満たす事が出来る。

  • 入れ物 次へ
    • 入れ物のカーソル位置に次を足す1
    • 入れ物のカーソル位置のプレイヤを起動する

さて、入れ物に次のようなボタンが入っていたとする。

  • ページ1を表示
  • ページ1のサブタイトルを表示
  • ページ2を表示

この場合、ページ1とページ2を入れ替えたい時、二行目の「ページ1のサブタイトルを表示」も同時に移動したい。すると、ただ入れ物の中にボタンを入れるだけじゃなくて、再帰的に入れ物の中に入れ物を入れたくなる。

  • ページ1の入れ物
    • ページ1を表示
    • ページ1のサブタイトルを表示
  • ページ2を表示

しかし、「入れ物の次へ」スクリプト再帰的に入れ物を実行する事が出来ない。例えばこの場合、「ページ1の入れ物」にある二つのボタンが実行し終わる間、親の「入れ物」は次へ行かないで待っていて欲しいのだが、これを実現するには、

  • 子の入れ物のカーソルを次に進める
  • 子の入れ物のカーソルが末尾にあれば、カーソルを先頭に戻して自分を次に進める。

という処理が必要になる。

問題の一般化

これは、etoys の他の問題と一般化して考える事が出来る。例えば、タートルグラフィックにループを使って良いのか問題。ループはチクタクと同期しないので、ゆっくり実行したり step で実行出来ない。この問題を、わざとらしく prolog で記述してみる。

book(page1).
book(X) :- page2(X).
page2(page2).
page2(showPage2Text).
book(page3).
?- book(X).

X = page1 ;

X = page2 ;

X = showPage2Text ;

X = page3 ;

この場合、page2 の定義が入れ子になっているにも関わらず、一つずつ出力される。この問題の解決は、上で書いたような特殊な「次へ」を使っても解決出来るが、一般化した方法によって、入れ物を使った推論プログラムに使えるかも知れない。

イデア

プレゼンツールの問題が、入れ子構造を順に辿る事として一般化出来るのであれば、一つの BookMorph に囚われないカーソルを新たに作るという手がある。そのカーソルモーフが構造を順に辿ってボタンを起動していく形にすれば良いかもしれない。