Smalltalk := nil

最近は _ でなく、メダカ := を使っている。
Squeak上では_は←に見えるのだが、
今やってるやつはフォントの関係で _ が本当に _ に見えるから。


で、それはいいとして、abeeさんがコメントに書かれている
Smalltak := nil を見てみました。


Smalltakはグローバル変数である。
グローバル変数Smalltalkの中に入っている。


SystemDictionaryはDictionaryである。
Dictionaryは簡単に言えばAssociationのCollectionである。
というのは嘘で、LookupKeyのCollectionであると思われる。


LookupKeyの一種にReadOnlyVariableBindingというのがある。
普通のLookupKeyはvalue:という呼び掛けにvalueを返すが、
ReadOnlyVariableBindingは妙な声を出す。


SmalltalkSmalltalkにAssociationとしてではなく、
ReadOnlyVariableBindingとして格納されている。


Smalltalk := nil.
という呼び掛けは、いつの間にか、
(Smalltalk associationAt: #Smalltalk) value: nil.
のような感じにされていると思われる。
だから := nil と呼び掛けると妙な声を出す。


Smalltalkだけではなく、他のグローバル変数を守るには同様のことをすれば良い。
TMP := nil.
(Smalltalk associationAt: #TMP) beReadOnlyBinding
TMP := nil.
こうするとTMPも妙な声を出す。


さて、誰がどこでこんなことをしているのだろうか?
デバッガーでも見えない。
もっと深いところで誰かが何かやっている。


なんとかNodeとかいう、数ヶ月前にちょっとだけ読もうとしたところが関係しているようだ。
id:Squeakerさんが見てみろと仰ってるのはこの辺のことなのかもしれない。


Squeakerになるためにはきっとこういうところを読まなければならないんだろう。
今のところ読む予定は無いけど、もしかして命令だったりするのか。