アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita
(ユーザー定義クラス・アクションの一覧「defs」と定義の出力「show」の続き)
対話ウインドウクラスdispframeとそのインスタンスdisp
画面の下の方に表示されている矩形領域はdispframeという対話ウインドウクラスのインスタンスで、使用中のものはdispという変数に代入されています。

例によってALLDEFSでto dispframe …で始まるコードやコメントを読むとこのウインドウの使い方(応答できるメッセージやその送り方)が分かります。
たとえば、すでに何度か出てきているように← <ASCIIコード>というメッセージを送れば指定したASCIIコードに割り振られた文字が、← <文字列>というメッセージを送ればその文字列が表示される…とか、


画面が汚れてしまったらdisp clearで消して、disp displayで描き直すことができる…とか、です。


一方で、「Open the ST-72 Manual」ボタンでダウンロードして読むことができる1976年刊の「Smalltalk-72 Instruction Manual」の記述にはある、ウインドウを移動したり(moveto)、サイズを変える(growto)といったいくつかのメッセージ

これらへの応答は、「ALLDEFS」ボタンで参照できる1974年のALLDEFSには(かつ、それに近いバージョンのALLDEFSで起動しているらしいこの処理系のメモリダンプにも)まだ実装されていないことも分かります。
また、マニュアルにある1976年ごろのバージョンには、新規ウインドウの作成、削除(閉じる)、大きさの変更、移動といったマウス操作も可能だったようですが、それらも当然まだ実装されていません。

これらは矩形領域の高速な描画を可能とするBitBLTルーチンが発明され、あるいはそれがマイクロコード化された後に実装された機能だと思われます。

put <文字列> at <x座標> <y座標>
ウインドウ操作に関連する振る舞いが軒並み未実装ななか、かろうじて、任意の文字列を任意の場所に表示するdisp put <文字列> at <x座標> <y座標>という式は使えるようです。

これは実質、ウインドウを移動しているコードなので、このメッセージを送ることでdispを画面の上の方へ移動してみましょう。ただしこのput …メッセージは、レシーバーであるdispframeのインスタンス(ここではdisp)を移動しはするものの、指定した文字列を表示するだけでフレームの描き直しなどはしてくれません。そこで「disp display. disp clear」を続けて実行することで、枠やプロンプトの表示も行います。

dispに手をつっこんで('s)縦の長さ(winhtとfrmht)を変える
dispframeのインスタンス生成式やそれについてのコメント、

あるいはdispframeインスタンス化時(つまりdispframeが直接コールされた結果、isnewが非偽値を返すときに実行される──)isnew ⇒(…以降の初期化コード片を読むと、ウインドウの高さはwinhtとfrmhtに保持されていることが分かります。

そこで、dispに's (<評価したい式>)を送って、直接これらのパラメーターを書き換えてしまいます。より多くの行数を表示できるように、バッファー(buf)も増やしておきます。「disp display. disp clear」の追加も忘れずに。


任意の場所にスクロールさせることはできませんが、このくらいの縦幅があれば、クラスやアクションの定義を整形して表示するshowアクションもかなり快適に使えます。
