アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita
(継承が…ない!(クラス変数の活用)からの続き)
クラスを問い合わせるis?
継承がないということは、Object
に代表される“すべてのオブジェクトの振る舞いを決める基底クラス”もないわけで、つまり、クラスを問い合わせるメッセージis?
のような基本操作にも、そのパターンマッチをいちいち定義しておかなければ応答がままならないことを意味します。
多くのクラス(のインスタンス)がis?
に応答できるのは、単純にis
のパターンマッチが定義されているからなのですね。
ISIT
の正体
ではここでeval
(評価)されているISIT
とは何者でしょうか? 定義はこんな感じです。
続くトークンが?
(タイプして入力するときは~
)なら、クラス名(TITLE
プロパティ)を返し、そうでなければTITLE
プロパティと続くトークン(評価せずに取り込む:☞
)と等価ならそのまま、等価でなければfalse
を返す…というコード片と同義の配列が、グローバル変数ISIT
に代入されたものとなっています。
運用時はこれにeval
を送ることで評価できます。シェアしたいコード片(処理)を配列のままグローバル変数に保持し、各クラスでの記述を最小限にするという継承の無い辛みを軽減するもうひとつの工夫ですね。
エラーにならないis?
クラスはisnew
アクションを呼ぶアクションに過ぎないことは既に述べましたが、この最少構成であるクラス(仮にfoo
。is
のパターンマッチはあえて定義しない)のインスタンスを使ってis?
にどんな応答をするか調べてみましょう。
あれ? おかしいですね。foo
とこそ返しませんが、untyped
などとそれっぽい答が返ってきます。これはいったいなぜでしょうか。
(知らないメッセージはスルーする?に続く)