Smalltalkの法灯を受け継ぐPharo処理系を練習中デス。「中身はどうなっているかなんて気にせずにイケイケ推奨」らしいPharo様ですが、度々その名を聞くので気になって夜も眠れない(ホントか?)のがMorphって言葉です。「変態?」どうもそれとは違うみたいです。練習問題でその一端が発覚。
※「ソフトな忘却力」投稿順 Index はこちら
※今回の動作確認は、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。
The Lights Out、ソフト練習用のミニゲーム
さて、以下の文書ではChapter 6、
Pharo by Example 9 – 2022 Edition
以下の日本語版ドキュメントでは
https://github.com/SquareBracketAssociates/PharoByExample-japanese/blob/master/PBE1-ja.pdf
Chapter 2に登場するのが Lights Outという小さなゲームです。これを作りながらPharoの流儀を学べって感じです。ただし、日本語版をおつくりいただいたころのPharo様はバージョンがかなり若かったようで、2022年のPharo 9での記述とは微妙に異なる部分があります。日本語版のコードそのままだと Pharo 10上ではダメな部分がありました。
さてこのLights Outというのはグラフィック使ってます。最初に定義しなければならないクラスが以下に。
SimpleSwitchMorphとな。出たなMorphという感じ。
ついMorphまで遡ってしまう
「中身なんてイチイチ気にせずにイケや」というお教えに逆らって、つい遡ってしまいました。だって、UMLのタブ開いたらバレバレじゃん。。。こんな感じ。
一番下に、定義したLOCellというクラスがありますが、そこからSuperな人たちをたどっていくとその根っこにはMorphがおられました。まあ、UMLのクラス図のタブを開かなくてもSystem Browser上でも見えるけど。こんな感じ。
気になったのでMorphのHelpを読んでみたらこんなんでした。
どうもPharoの「充実したGUI環境」を支える根幹のクラスのようです。どおりでアチコチに出没しているのね。
Pharoの地のウインドウに出現する以下の「Pharoのロゴ」もそう。
右クリックで登場するWorld contentsメニューの ImageMorphという「オブジェクト」みたいです。
LOCellをnew
Exampleのお教えどおり、LOCcellにインスタンス・メソッド initialize を追加してみました。こんな感じ。黄色のマーカはこっちで勝手につけてます。
この「initialize」というお名前が特別なのは、新たにクラスインスタンスを生成したときに、生成されたばかりのインスタンスに自動で送られるメッセージになるためのようです。そして継承しているSuperクラスにも初期化をお知らせするために、先頭で super initializeするのがお作法みたい。知らんけど。
LOCell newした結果をInspectorでみてみよ、というご指示もあったので、Workspaceで LOCell newをインスペクトしたらこんな感じ。
入力したのは短いコードだけれども、背負っているSuperな者どもから引き継いでいるものは多いのね。。。
しかし、Pharo様流なのは、Inspectorウインドウの中からでも インスペクトしている実体オブジェクト self に対してメッセージを送ることができること。上記のような操作をdo itした結果が以下に。赤丸は当方で書き込みました。
赤丸の中にある黄色い座布団みたいのがLOCellです。確かにクリックするとONとOFFで色が変わります。しかしx印も何もないウインドウ、困ったな。
ALT+SHIFT+クリック(メタクリック)
LOCellの周りにいろいろでてきましたな。今回はx印で閉じるだけっすけど。
この後、Exampleの御本ではSystem Browserのエディタの機能やら、Debuggerやらを使っていろいろやっているのだけれど、今回はここまで。忘却力の老人は1回じゃとても覚えきれません。