TypeScriptの名前構造を基準に考える。宣言空間とは、パーティションされた名前コンテナのパーティションのことで、通常は「名前空間」だが、名前空間が内部モジュールの意味なので宣言空間としている。
宣言空間は、名前の集合というよりは、順番があるので名前のリスト。
- 原則としては、ひとつの宣言空間に同じ名前が複数出現できない。
- 例外: 後の名前が先の名前を上書きすることがある。
- 例外: 後の名前のリファレントが、先の名前に追加されることがある。
- 例外: 同一の名前が異なる複数のリファレントを持つことがある。
それぞれ、
- 一意不変名〈イミュータブル〉 再宣言/再定義でエラー
- 上書き可能名〈オーバーライタブル〉 再宣言/再定義で破壊的書き換え
- 追加可能名〈アダブル〉 再定義で追加
- 多義名〈アンビギュアス〉再宣言/再定義で多義化(一種の追加)
TypeScriptのオープンエンド〈open-ended〉という性質は、名前〈ラベル〉の性質ではなくて、宣言のタイプが持つ性質。interfaceがオープンエンドだとは、interface宣言というタイプの宣言が持つ名前構造への作用の仕方について述べている。
interface宣言がひとつのパーティションに同じ名前〈ラベル〉で作用するのが許されて、その作用がマージと定義されている。
被作用対象物である名前構造=名前グラフと、作用素である宣言・定義との関係が大事。宣言・定義の時系列シーケンスが、名前グラフ(の空間)に状態遷移をもたらす。個々の作用と、エラーするか/成功するか、成功のとき引き起こされる作用を状態遷移マシンとして記述すべき。
宣言・定義が、構文的対象物の空間を状態空間に作用する遷移作用素であり、宣言・定義という行為が状態遷移マシンの実行になることに注意。
- 課題:これらを形式化する必要がある。