名前空間
ここでは,Yuライブラリにおける名前空間の設置などの規則を規定する. サブライブラリと名前空間の関係については,ここでは規定しない.
公開名前空間
公開名前空間とは,ユーザが直接アクセスするエンティティを格納するための名前空間である.
サブライブラリが提供するエンティティは,そのサブライブラリの公開名前空間に格納しなければならない. 意味論的な境界として理解可能である場合に限り,下位の公開名前空間を設置することが認められる.
エンティティを言語要素の種類による分類のために公開名前空間を設置することは,原則として認めない.
例えば,そのサブライブラリが提供するコンセプトを格納するためにconcept名前空間を設置してはならない.
ただし,ユーザ定義リテラルを分離し格納するためのliteralsインライン名前空間を設置することは,例外として認める.
なお,ここで規定した公開名前空間の階層構造について,ユーザが同じようにアクセスできる限り,階層の間に非公開インライン名前空間を設けることを認める.
例えば,yu::fooに属するとされたエンティティが,実際にはnamespace yu::foo::inline _barにあったとしても問題ない.
非公開名前空間
非公開名前空間とは,ユーザが直接アクセスしないエンティティを格納するための名前空間である. 意味論が規定されているエンティティであっても,ユーザが直接アクセスしないものであれば,非公開名前空間に格納される. インラインでない非公開名前空間のエンティティに対する直接的な依存は,互換性を保証しない.
非公開名前空間の名前は,先頭をアンダースコア1文字で始めなければならない. 非公開名前空間の設置や構造に対しては,APIに影響しない限り規則を設けない.
以下の4つの非公開名前空間は,目的を明確に定めておく.
_detail名前空間
_detail名前空間は,APIに一切の影響を与えない実装詳細を格納する.
ここに属するすべてのエンティティは意味論に関与しない.
_unspecified名前空間
_unspecified名前空間は,その存在と動作が仕様に現れるが,具体的な同一性が保障されないエンティティを格納する.
ここに属するエンティティは意味論に関与する.
例えば,CPOの関数オブジェクトの型は,その存在と動作が保障され,APIを構成するが,具体的な名前などは保障されないため,ここに格納される.
_unobservable名前空間
_unobservable名前空間は,動作のみが仕様に現れるが,具体的な同一性が保障されないエンティティを格納する.
ここに属するエンティティは意味論に関与せず,ユーザから認知されない.
例えば,式DSLの中間となるオブジェクトの型は,適切な動作を持つことが保障されるが,具体的な名前などは保障されないため,ここに格納される.
_exposition名前空間
_exposition名前空間は,仕様の説明に用いるエンティティを格納する.
ここに属するエンティティの意味論は保障され,動作は意味論の保障のために規定される.
実装が存在するかは規定されない.
例えば,リファレンス上でsee belowと書かれる部分の実装は,仕様の説明のために存在するため,ここに格納される.