Identifier も Literal も値でありどちらも「参照される」ことは可能だが、 Literal は「参照する」ことはできない。つまり "hoge" というリテラルは常に同じオブジェクトIDをかえす。
言い換えると Identifier は自身の文字列表現を表す @name という属性を持つが、Literal は持たない。Identifier も Literal も自身の値を表す @value という値を持つ。
スコープは識別子のリスト (List[Identifier]) で表される。ネストされたスコープは直上のスコープに加えて自身の内部で定義された識別子のみ参照できる。
# __SYMBOLS__ は仮想的な変数 hoge := "unko" fuga := "gero" { unko := "gerry" hoge := "hello" # __SYMBOLS__ = [unko -> "gerry", hoge -> "hello"] } # __SYMBOLS__ = [hoge -> "unko", fuga -> "gero"]
すべてのメッセージは暗黙の self というレシーバが補われていると考えることができる。 self は定義済み識別子の辞書なので、あるメッセージ A は self という辞書の A というキーの値を取り出す操作に等しい。
パッケージとそれを導入する(擬似的な)文を考える。
package Hoge { unko := "gerry" }
これは、ブレースの中のスコープにおける self に Hoge を代入しているにすぎない。