Smalltalk のキーワード

LL魂 ランゲージアップデートで今年は Io が紹介されました。その Io のパネルに

キーワードの数

Perl       : 180?
C++        : 63
JavaScript : 59
PHP        : 53
Java       : 53
Ruby       : 40
C99        : 37
Python     : 28
Lua        : 21
Smalltalk  : 5
Io         : 0

というのがありました。

会場で見たときには「我らが Smalltalk に キーワード(予約語)なんてあったけ?」でしたが、後でゆっくり考えてみたら偽変数のことか、と思い当たりました。(ここら辺が Smalltalk 素人)

偽変数とは、最初から初期化されていて、新しく同じ名前で作ったり最代入できなかったりする変数です。Smalltalk には、

true false nil self super thisContext

の 6個の偽変数があります。(アレレ? 6個??)*1

簡単に説明すると true false nil は、True、False、UndefinedObject のインスタンスが束縛されていて、self super はその場にあわせてレシーバーオブジェクトを、thisContext は評価中のコンテキストオブジェクトを束縛しています。偽変数は 最代入できないし、同じ名前のローカル変数を作ることも出来ないから、キーワード的です。

では「キーワードゼロ」を標榜している Io は どうなのかな、とこちらをざっと見てみたのですが、Io にも self とか thisBlock とか の最初から初期化されている変数(スロット)はあります。でも普通にそういう名前ってだけの変数なのかしら。謎。

そんな話を考えているうちに、そう言えば Smalltalk って 外のスコープの変数を内側のスコープの同じ名前の変数で隠せたっけ?と疑問に。Smalltalk では 命名規約が違うので、グローバル側と同じ名前のローカル変数を作る機会がないですし、ブロックコンテキスト内の変数も、

| foo |
foo := 'hello'.
[ | foo |
	foo := 'world'.
	Transcript cr; show: foo] value.
Transcript cr; show: foo.

みたいなのは、ブロックの中と外で同じ名前はダメと怒られます。だから偽変数と同じ名前の変数を再定義できないほうは、他の変数でも(出来るは出来るけれど)普通やらないし、再代入できないのはソッチの方が嬉しいですし、偽変数だからって特別な感じがしないです。だから偽変数 = 予約語が頭の中でつながらないのも、しょうがない気がします。

・・・・・・あぁ、キーワードをネタに話を膨らませようとして全然膨らまないし纏まらなかったよぅ。なんだこの駄文 orz

*1:はてなの色づけは thisContext だけされてませんね。うーん、thisContext は仲間はずれ?