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
アクションを使ってこれを追加しておきます。
∢
(アイボール)は「%」、⇒
(~ならば)は「?」、⇑
(リターン)は「!」、!
(do-it)は「\」で入力できます。
squareアクションの定義
square
アクションは、boxクラスのインスタンスが四角を描くのに使います。数値をメッセージとして送ることで、一辺の長さが決められます。描かれる四角の向きは、タートル(😄
)の向きに準じます。
←
(代入)は「_」、😄
(スマイリー)は「@」で入力できます。
boxクラスとjoeおよびjill
box
クラスは、位置を保持するx
とy
、描く四角の一辺の長さのsize
、角度のtilt
というインスタンス変数を持ち、ここで示す定義の段階ではdraw
、undraw
、grow <長さ>
、turn <角度>
というメッセージに応答できます。
box
クラスをコールしてインスタンスを生成させjoe
もしくはjill
に代入すると、画面に四角が描かれます。
grow <長さ>
や turn <角度>
といったメッセージを送って、どのような変化を見せるか実際に試して楽しんでみてください。
ウインドウを大きくしてしまった影響で、スクロールが発生するとjoeやjillが消えてしまうので、ちょっと手間ですが、定義が終わって遊ぶ前にウインドウを元の小さなサイズにもどしておく(disp put '' at 16 514. disp's (☞winht ← ☞frmht ← 168). 😄 erase. disp display. disp clear
)とよいかもしれません。