メモ #1

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 を代入しているにすぎない。