self、super、thisContext、あるいは、メソッドのパラメータ変数やブロックのブロック変数が擬変数(変数のように使えるが、ユーザーが任意のオブジェクトを代入できない。つまり代入できない)であることは、 誰でもある程度、直感で理解できるものですが、nil や true、false がそれであることは分かりにくいですね。ついつい、nil、true、false といったオブジェクト(リテラル)たちが実際に存在するかのように思えてしまいます。
そんなとき、便利(?)なのが、リテラルのみを要素に限定した an Array のリテラル式。
#('this' is $a 10)
これに、nil、true、false などを入れて評価(print it)してやればこれらがリテラルでないことが実感できます。w
#(self super thisContext nil true false) "=> #(#self #super #thisContext #nil #true #false) "
てなぐあいで、全部、シンボル(a Symbol)になってしまいます。
#(self super thisContext nil true false) allSatisfy: [: each | each class == Symbol] "=> true "
なお、Squeak システムでの Smalltalk では、掟破りのカーリーブレイス(中括弧)が、任意のオブジェクトを要素とする an Array の生成に使えるので、
{self. super. thisContext. nil. true. false} "=> #(nil nil UndefinedObject>>DoIt nil true false) "
なんてふうにすることで(擬変数がシンボルになってしまう問題(?)は)回避できます。カーリーブレイスは、その中のひとつひとつの式の評価結果を各要素にするので、要素の切れ目には式の区切りを意味するピリオドを忘れないでね!w