Smalltalk-72で学ぶOOPの原点:サンプルコード「joe the box」(turtleにplace追加、squareとboxの定義)

アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita


ウインドウを無理矢理サイズ変更&移動するの続き)

「joe the box」とは

Smalltalk-72の操作マニュアルや関連の文献に良く出てくる定番のデモです。四角を描くクラス「box」を定義したり、それをインスタンス化して「joe」とか「jill」といった名前を付け、彼・彼女らにメッセージを送ってインタラクティブに操作することを通じ、メッセージングのオブジェクト指向を学びます。

turtleクラスにplaceメソッドを追加

show tuttleでtuttleクラスのコードを見てみましょう。前回ご紹介した方法(disp's (☞winht←☞frmht←666. ☞buf←buf+string 3000). disp put '' at 16 16. disp display. disp clear など)で、ウインドウを画面一杯に広げておけばぎりぎり表示が収まります。'sの入力にはちょい直し版が必要です。'sはctrl-shift-sか「|」で、(指さし矢印)は「"」で入力できます。

turtleクラスの定義にplaceに応答するためのメソッドが書かれていないことを確認したら、addtoアクションを使ってこれを追加しておきます。

f:id:sumim:20191224225054p:plain
turtleクラスの定義(「show tuttle」で表示)と、addtoアクションを使ったplaceメソッドの追加

(アイボール)は「%」、(~ならば)は「?」、(リターン)は「!」、(do-it)は「\」で入力できます。

squareアクションの定義

squareアクションは、boxクラスのインスタンスが四角を描くのに使います。数値をメッセージとして送ることで、一辺の長さが決められます。描かれる四角の向きは、タートル(😄)の向きに準じます。

f:id:sumim:20191224230943p:plain
squareアクションの定義

(代入)は「_」、😄(スマイリー)は「@」で入力できます。

boxクラスとjoeおよびjill

boxクラスは、位置を保持するxy、描く四角の一辺の長さのsize、角度のtiltというインスタンス変数を持ち、ここで示す定義の段階ではdrawundrawgrow <長さ>turn <角度>というメッセージに応答できます。

boxクラスをコールしてインスタンスを生成させjoeもしくはjillに代入すると、画面に四角が描かれます。

grow <長さ>turn <角度> といったメッセージを送って、どのような変化を見せるか実際に試して楽しんでみてください。

f:id:sumim:20191224231743p:plain
boxクラスの定義とjoeおよびjillへのインスタンスの代入、メッセージングによる操作

ウインドウを大きくしてしまった影響で、スクロールが発生するとjoeやjillが消えてしまうので、ちょっと手間ですが、定義が終わって遊ぶ前にウインドウを元の小さなサイズにもどしておく(disp put '' at 16 514. disp's (☞winht ← ☞frmht ← 168). 😄 erase. disp display. disp clear)とよいかもしれません。

サンプルコード「joe the box」(is、'sの追加)に続く)