第 11 章 OCaml 语言

3 标识符

标识符用于为几种语言对象命名,并在稍后通过名称引用这些对象。

这 11 个命名空间通过上下文和标识符的字母大小写来区分:标识符的第一个字母是否为小写(在下文中写为 lowercase-ident)或大写(写为 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
 
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 版本的兼容性而避免使用小写变体标签。

引用命名对象

命名对象可以通过其名称(遵循名称的常规静态作用域规则)或访问路径 prefix . name 来引用,其中 prefix 指定一个模块,而 name 是该模块中定义的对象的名称。路径的第一个组件 prefix 可以是简单的模块名称,也可以是访问路径 name1 . name2 …,以防定义模块本身嵌套在其他模块中。为了引用类型构造函数、模块类型或类类型,prefix 也可以包含简单的函子应用(如上面的语法类别 extended-module-path 中所示),以防定义模块是函子应用的结果。

标签名、标签名、方法名和实例变量名不需要限定:前三个是全局标签,而后者是类本地。