シンボルの扱い

Schemeのシンボルはあくまでもシンボルというデータ型の一つにすぎない。しかし、同時に変数の識別子としても利用されており、評価するとそのシンボルに束縛された値を返すようになっている。
このようにlisp/Schemeでは一つの要素であってもその局面に応じて機能が変化することが多い。逆にJavaでは一つの要素が表す機能を限定することが多い。この差は設計思想に由来すると思うのだが、そんなことよりも実装をどうするかを考えよう。
まず、シンボルというデータ型の特徴は(多分)

  1. 外部表現として文字列を持つ
  2. 評価すると束縛された値を返す
  3. 値の束縛はシンボルが定義された環境に従う

であり、この振る舞いさえ満たしていればどのような実装でも構わないはず。例えば、外部表現から内部表現への変換は

  • parse直後に行う。内部表現とは別に外部表現へのポインタも準備する。
  • 評価直前に行う。内部表現は保持しない。
  • 別スレッドで暇を見て行う。ポインタを持っておき、上の二者の間で切り替える。

などが考えられる。スコープの性質からはparse直後が妥当に思えるが、別スレッド式も面白い*1

*1:とはいえ、利点は少ない。