識別子はオブジェクトの名前で、その名前でオブジェクトにアクセスできます。
これら 11 の名前空間は文脈と識別子の大文字小文字(先頭の文字が小文字 — 以下である lowercase-ident mdash; か、大文字である — 以下capitalized-ident)で区別されます。ここではアンダースコアは小文字と見なされます。
value-name | ::= | lowercase-ident |
| | ( operator-name ) | |
operator-name | ::= | prefix-symbol | infix-op |
infix-op | ::= | infix-symbol |
| | * | = | or | & | := | |
| | mod | land | lor | lxor | lsl | lsr | asr | |
constr-name | ::= | capitalized-ident |
label-name | ::= | lowercase-ident |
tag-name | ::= | capitalized-ident |
typeconstr-name | ::= | lowercase-ident |
field-name | ::= | lowercase-ident |
module-name | ::= | capitalized-ident |
modtype-name | ::= | ident |
class-name | ::= | lowercase-ident |
inst-var-name | ::= | lowercase-ident |
method-name | ::= | lowercase-ident |
以上のように、前置シンボルや中置シンボル、いくつかのキーワードは、括弧でくくることで値の名前として使えます。 大文字小文字で区別する規則は要約すると以下のようになります。
名前空間 | 先頭文字の大文字小文字 |
---|---|
値 | 小文字 |
コンストラクタ | 大文字 |
ラベル | 小文字 |
バリアントタグ | 大文字 |
例外 | 大文字 |
型コンストラクタ | 小文字 |
レコードフィールド | 小文字 |
クラス | 小文字 |
インスタンス変数 | 小文字 |
メソッド | 小文字 |
モジュール | 大文字 |
モジュール型 | どちらでも |
バリアントタグに関する注意: 現在の実装では大文字だけでなく小文字のバリアントタグも受理しますが、将来の OCaml バージョンとの移植性、互換性を考えると小文字は避けておいた方が無難です。
value-path | ::= | value-name |
| | module-path . value-name | |
constr | ::= | constr-name |
| | module-path . constr-name | |
typeconstr | ::= | typeconstr-name |
| | extended-module-path . typeconstr-name | |
field | ::= | field-name |
| | module-path . field-name | |
module-path | ::= | module-name |
| | module-path . module-name | |
extended-module-path | ::= | module-name |
| | extended-module-path . module-name | |
| | extended-module-path ( extended-module-path ) | |
modtype-path | ::= | modtype-name |
| | extended-module-path . modtype-name | |
class-path | ::= | class-name |
| | module-path . class-name |
名前付きのオブジェクトはその名前で参照する (名前のための通常の静的なスコープルールによって) か、アクセスパス prefix.name によって参照できます。ここで prefix はモジュールを、 name はそのモジュールで定義されたオブジェクトを表します。 パスの最初の部分 prefix は単なるモジュール名か、アクセスパス name1.name2 ... となり、後者では名前を定義しているモジュールはそれ自身他のモジュールの中に入れ子なっていることになります。 型構成子やモジュール型を参照する場合、 prefix は 単純なファンクタ適用を含むことができます(上の構文クラス extended-module-path のように)。この場合、定義されているモジュールはファンクタ適用の結果です。
ラベル名、タグ名、メソッド名とインスタンス変数名は修飾する必要はありません。前3つはグローバルなラベルですし、後者はクラス内でローカルです。