Smalltalk-72で学ぶOOPの原点:ユーザー定義クラス・アクションの一覧「defs」と定義の出力「show」

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


Rubyのinstance_eval相当の「's」の続き)

defsによる、ユーザー定義クラス・アクションの一覧

defsには、ユーザーが定義したクラスやアクションが収められています。

f:id:sumim:20191219013210p:plain
クラスやアクションをユーザーが定義すると「defs」に追加される

defsobsetというクラスのインスタンスです。

f:id:sumim:20191219013342p:plain
「defs」は「obset」のインスタンス

obsetについて

obsetは、今のSmalltalkBag(重複を許す集合)とSet(重複を許さない集合)のどちらとしても使えるSmalltalk-72組み込み(ブートストラップ時=ALLDEFSに定義)のコンテナクラスです。

f:id:sumim:20191219010729p:plain
「obset」の定義

定義を見るとわかるように、add <要素>メッセージで追加した場合は要素の重複を許し(つまり、すでに同じ要素があっても追加される)、← <要素>メッセージで追加した場合は既に追加済みなら無視される仕組みになっています。

f:id:sumim:20191219011632p:plain
「obset」をBagのように、もしくは、Setのように使う

アクションやクラスの定義の出力

showアクションにクラスやアクションを送ると、その定義を整形して出力することができます。

f:id:sumim:20191219012213p:plain
「show」アクションでクラスの定義を整形して出力

例によってALLDEFSのto show …から始まる記述付近に定義があるので余力があれば参照してみてください。

まさにこのようにALLDEFSから該当するコードを探して読んだり(組み込みクラス・アクションの場合)、editで配列(ブロック)にいちいち潜りながら読むよりずっと便利な機能なのですが、縦に長くなりがちな整形したコードを出力するにはデフォルトのウインドウの縦幅が狭すぎます。ちょっと長めのコードをshowで表示させると、すぐ画面からあふれて使い勝手が悪いです。これを少しでも解消するため、ウインドウを移動してもっと大きく全画面表示にできないか考えてみましょう。

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