アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita
(継承が…ない!(「is?」の実装))からの続き)
知らないメッセージは基本スルーするSmalltalk-72
is
パターン未定義時のis?
の挙動の不思議はひとまず置いておくとして、Smalltalk-72でオブジェクトが知らない(パターン未定義の)メッセージを受け取ったときの挙動を確かめておきましょう。
ためしに3
にhoge
を送ってみます。
すると、エラーになります。
ただ「シンボル(hoge
を指す)は値を持たない」というちょっと不思議なエラーになります。
ちなみに参考まで、今のSmalltalkでは「そんなメッセージ、知らない」がこういうときのエラーの基本です。
実は、Smalltalk-72では知らないメッセージは基本スルーする仕組みになっており、したがって、続くメッセージを新しい式の始まりと認識されます。つまり、続くメッセージの最初のトークンは次のメッセージ式のレシーバーになるので、hoge
は変数として認識され、それに値が代入されていないという件のエラーになるわけです。
試しに、あらかじめhoge
に4
を代入しておいてから改めて3 hoge
を評価してみましょう。
なるほど4
が返ります(このとき3
はREPLで複数の式を評価したときの一つ前の式と同じ扱いとなり、普通に破棄され結果=出力には影響を与えません)。
知らないメッセージは基本スルーというのは、悪名高きObjective-Cのnil
の挙動(もっとも彼はオブジェクトですらないので、知っているメッセージなど無く、すべてのメッセージをスルーするわけですが…)を彷彿とさせて、なんだかちょっと残念ですね。これについては、アラン・ケイのアイデアに忠実にした結果なのか、はたまたただ単純に実装の都合や運用の妙の類いに過ぎないのか、もう少し調べてみたいと思います。
is
アクション
ということで、実はALLDEFS(ブートストラップコード)にはto is …
で始まるis
アクションが別に定義されていて、is
メッセージに対応できないオブジェクトにis?
等のメッセージが送信されたとしても、レシーバーがそれに応答する代わりにis
アクションがコールされ(それに改めて?
が送られることで)untyped
を返すことができる、というのがこのカラクリの答でした。