ひさしぶりに SqueakSmalltalk-72 エミュなどいじってみました。特にクラス定義に関して、以前触ったときにははっきりしなかった部分を、今回は比較的しっかり理解できたように思えます。とりあえず今のところの理解をメモ。
ちなみに、Smalltalk-72 とは 1970's の PARC で、メッセージ送信メタファにもとづくオブジェクト指向に則って構築された Smalltalk の都合 5 回(数え方によっては 3 回)にわたる開発サイクルにおいて、その第 1 サイクル目(1972-74 or 76)の成果物です。現在の Smalltalk とはかなり違った文法やオブジェクトモデルになっています。LISP にちょっと似ていて、オブジェクトの定義はもっぱら GUI を通じて対話的に行なうことの多い現在の Smalltalk よりはずっと、Ruby など Lightweight Language が醸し出すイメージに近いかもしれません。

to className tempVar : instVar : classVar (
  isnew?("tempVar _ 1. "instVar _ 2. "classVar _ 3)
  %tempVar?(%_?(:tempVar) !tempVar) 'not work...'
  %instVar?(%_?(:instVar) !instVar) 'set or return the inst var'
  %classVar?(%_?(:classVar) !classVar) 'set or return the class var'))

"inst1 _ className
"inst2 _ className
inst1 instVar '=> 2'
inst2 instVar '=> 2'
inst1 classVar '=> 3'
inst2 classVar '=> 3'
inst1 instVar _ 20
inst1 instVar '=> 20'
inst2 instVar '=> 2'
inst1 classVar _ 30
inst1 classVar '=> 30'
inst2 classVar '=> 30'

コメントは文字列リテラル式で代用しているようです。従って、定義文ではスルーするのでいいのですが、実行式ではコメントを除かないとそのままではコメント代わりの文字列を返してきてしまうので注意してください。コードはコピペでもってゆくことができますが、実際の画面では、" は「右指し手形」、? は「太い右矢印」、_ は「←」、% は「眼球」で表示されます。キーボードの上方向矢印キーを押すことで、「!」が自動的に追加され、そこまでの式を評価する(今の Smalltalk 環境でいうところの print it (alt/cmd-p) する)ことができます。

to の後、クラス名に続けて、テンポラリ変数、インスタンス変数、クラス変数をそれぞれのセクションを : で区切るようにして宣言します。isnew はインスタンス生成直後に true を返す関数。? は条件付き実行式に使う記号で「条件 ? (真時処理) (偽時処理)」というように書きます。条件に合致しないときは真時処理は無視され、偽時処理を実行します。% は送信されたメッセージのパターンマッチを行ないます。指定された続けて記述された文字列と一致すれば true を返すようです。たとえば、%instVar の行は、インスタンスに instVar というメッセージが送られたら、次のメッセージが _ かを見て、そうなら次のメッセージ(引数)をインスタンス変数 instVar に代入(:instVar)、そうでなければ、つまり、_ 10 などの代入を意図するメッセージが続かないのであれば instVar の値を返す(!instVar)といった具合です。

メッセージに関しては、現在の Smalltalk における「メッセージ = セレクタ + パラメータ」という考え方と違っていて、パラメータ自体がメッセージである Soopy やプロトタイプベース言語の Io のそれに似ていなくもありません。