レッスン18

Mini-Logo言語をつくり出す

【以下、【】内は訳者が勝手に付け加えた部分です。なお、少し古すぎると思われた事柄で省略した部分があります。】

クラスPenとPolyで確立されたフレームワークのおかげで、Logo言語のミニチュア版を作ることができます。これは、タートルと呼ばれる三角形のオブジェクトの、スクリーン上での位置や軌跡をコントロールするものです。 — それでこのデモの名前がタートル(Turtle)なのです。

とっかかりの方法をいくつか示すことにします。 そこから、あなたは、かなり精巧なLogo類似の環境を開発することができるはずです。

この実験のために、Turtleのカスタマイズ版を書くことになります。これをLogoと呼ぶことにします。 エディターを用いてTurtleを修正し、あとでMopsにロードするためにLogoという名前を付けて保存します。

他方、新規に起動したのであれば、ファイルSinをロードしてください。わたしたちのLogoプログラムはSinの上にロードされることになります。

注意:FORGETはPowerMopsではもはや旧式のものなっています。確かにこのワード自体はPowerMopsでも定義されていますが、それを実行しても辞書の一部分(コード部分)しか消去しません。ですから、今の場合は、PowerMopsを一旦終了した方がよいでしょう。

言語をデザインする

まずは頭の中で、私達のミニLogo言語に何をさせたいのかを決めることから始めましょう。 最初に、スクリーン上に、Polyクラスの三角形オブジェクトとなるであろうタートルが必要です。 次に、いくつかの戦術を実行できる必要があります。例えば:タートルをスクリーン上でセンタリングする;それを与えられた方向に、私達が特定するピクセル数に従って移動させ、タートルはそのペンの軌跡をスクリーン上に残す;私達が特定する角度数値にしたがって右または左に方向転換させる。 そして最後に、ひとつの形、正方形を定義することになります。これは、私達が辺の長さがどうであるべきかをタートルに教えて描画させるものです。

PolyとPenで利用できるメゾッドに目を通すと、ある場所にタートルを描画して、それから別の場所に移動するならば、スクリーン上の元々のタートルは描画されたままになって、スクリーンが汚くなってしまうことに気付きます。 そのようなわけでPenクラスについて追加的なメソッドUNDRAW:を定義する必要があります。 これは指定した場所のタートルを消し描き(undraw)するものです。

UNDRAW:メソッドはPenPatternを(黒から白に)調節してオブジェクトを再描画することになりますから、このメソッドはDRAW:メソッドを用いて定義されることになります。 したがって、UNDRAW:メソッドは、DRAW:メソッドの後ならPolyクラスの何処にでも、その定義を置くことができます。

PenPattrnパラメタに関しては、CarbonドキュメンテーションのQuickDrawのページを参照することができます。 しかし、そこに助けになるほど十分な情報がなかったとき(ときどきそういう場合がありますが)、あなたはいつもMopsのパワーを役立てることができます。例えば、パラメターを試しながら、Penクラス内にオブジェクトからこのパラメターの現在値を取り出す特別なメソッドを置くことができます。
:m INSPECT:   \ ( -- Hipat LoPat mode w h x y )
    get: PnPatHi  get: PenPatLo  get: PnMode
    get: PnSize  get: PnLoc  ;m
次のようにメッセージを送ります:
inspect: Bic
そして .S演算を実行してスタック上のパラメータを見ます。 INIT:メソッドを呼ぶメッセージを用いてパラメターに別の値をおいて実験しましょう。

LogoとUNDRAW:に戻ると、白色のペンをつくるPenPatternの値は0,0で、黒色のペンでは-1,-1です。 PnPatHiとPnPatLoの各変数へ整数の組をおいて、白色ペンでオブジェクトを書き、それからペンを黒色に戻します。

UNDRAW:メソッドは次のようにしてもよいでしょうでしょう:
:m UNDRAW:   \ Erase object before moving it and restore black pen
   0 0 put: PnPatHi  put: PnPatLo  draw: self
   -1 -1  put: PnPatHi  put: PnPatLo   ;m

Logo風言語を実装する

次が、変更されたタートルの終わりの方に追加されるMops定義のリストです:
\ Create Logo-like environment

 poly turtle                   \ the name of our Logo object
 250 160 center: turtle        \ define the center of the screen
 10 3 size: turtle             \ set turtle's size

: SPOT            \ Erases old Logo command onscreen and repositions prompt
            8 210 gotoxy  ;

: .OK  -curs  spot  15 spaces  spot  +curs  ;

\ Shortcut definition for later:

: TURN  -curs  undraw: turtle  turn: turtle  draw: turtle  .ok  ;

\ Logo-like commands:

: HOME    -curs   cls   home: turtle   up: turtle
          draw: turtle  .ok  ;

: FORWARD            \ ( dist -- )
            -curs   undraw: turtle   move: turtle
            draw: turtle   .ok  ;

: LEFT  ( deg -- )    turn  ;

: RIGHT  ( deg -- )            negate  turn  ;

: SQUARE   { len -- }
           -curs   4 0  DO  len forward  90 right   LOOP
            .ok  ;

上のMopsワードは、名前から内容が自ずとわかるはずです。ただ、もしかすると、Logoプロンプトの位置を制御する二つのワードはそうではないかも知れません。 Logoでは伝統的なプロンプトの位置はスクリーンの左下隅に近い位置です。Mopsワード .OK は、オブジェクトがその印をスクリーン上につけた後は、いつもカーソルをプロンプトの位置に戻します。15 SPACESという演算は前のコマンドを上書きしてスクリーンをきれいにするために追加されています。 MopsのUtilitiesメニューから‘Echo during load’アイテムを選んでください。そして、Fileメニューから‘Load...’を選ぶか、
// logo
と打ち込むことによってLogoをメモリー中にロードしましょう。 プログラムのソースコードがメモリー中にコンパイルされる毎にスクリーン上に一行にずつ現れるでしょう。 もしも以前に定義されていないワードを用いていた場合は、ロードは中止され、定義が必要なワードを告げるメッセージが現れるでしょう。 ロードが完了したなら、CLS(PowerMopsではUtilitiesメニューから‘Clear Window’を選んでください)でスクリーンをきれいにして、あなたのプログラムを試してください。

タートルをホームのい場所から初めて、いくつかのLogoコマンドを送って、タートルに軌跡を描画させ、方向転換させ、様々な大きさの正方形を描かせてみてください。タートルをある角度だけ方向転換させたとき(特に45度の倍数でない角度のとき)、引き続くコマンドのときにタートルが完全に消去されないことに気付くでしょう。この理由は、ツールボックスがタートルを半端な角度で描画するときにはペンの終着点が元々の出発点から1ピクセル離れてしまう可能性があるからです。このような場合、UNDRAW:メソッドを呼び出すと、最後の操作の終着点から消し描き始め、元々の動きから1ピクセル外れてしまいます。

しかし、Mopsでは、これが解決困難な問題となることはありません。ご自分でこの問題に取り組んでみてください。 タートルの出発点を記憶しておくインスタンス変数をオブジェクトに追加して、UNDRAW:操作のときにこれを利用するようにしてみてください。それから、コマンドの入力をもっと容易にするために、新しいMops^Logoワードを定義してください(例えば、Forwardの代わりにFDというような短縮されたワードを定義する。)。 これは、Mopsグロッサリにある諸ワードやクラス-オブジェクト-メッセージ関係に手を染めるための舞台となります。

このチュートリアルの残りのレッスンでは、スクロールバーやマウス入力、ウィンドウ、メニューといったMachintoshらしい特徴を追加するTurtleプログラムの拡張の助けを借りることによって、Mopsの既定義クラスのいくつかをもっと詳しく探求することにします。


チュートリアル目次へ
前へ < レッスン17 次へ > レッスン19



最終更新:2018年12月09日 21:53