跳至主要內容

标识符

Cure-X大约 4 分钟

标识符(Identifier)是用于标识实体(Entity)的符号。简单来讲,就是给一个实体命名,或者说用一个名称指向一个实体。

我们来看一个代码片段:

identifier -> lit.string = 'entity'

其中 -> lit.string 的意思是表明 identifier 是 Lit 标准库的字符串类型。= 表示赋值(Assign)。这条语句(Statrment)的作用是用标识符 identifier 来标识实体 'entity'

一旦将实体标识,就可以对其进行重用。

lit.io.outl(identifier)

lit.io.outl 是输出的命令。这样操作过后,终端就会打印出 entity


提示

接下来是非常重要的内容


命名规则

接下来的部分是 标识符的命名规则
不过,Lit 为保持代码风格的一致性,部分字面量、全部关键字也都遵循此规则。
(事实上,大多数编程语言都是这么干的 ::smile_face::)

主要规则

  1. 标识符可以由字母、数字、下划线、美元符号 和 空格组成,长度需大于等于1
  2. 标识符首位不能是数字
  3. 不能和字面量或关键字冲突

次要规则

  1. 标识符区分大小写
  2. 若空格存在于标识符,则按照通用分隔符归一法记录
  3. 标识符不可重复声明

下面我将分条进行解释。


标识符的组成:字母、数字、下划线、美元符号、空格。

也就是说,标识符里含有其他符号是不合法的。

例如,a_b 是合法的,c*d 是不合法的。

这是因为,大部分的符号都有各自的用处。比如上面的 c*d,表示c和d相乘。所以自然不能允许它们出现在标识符中。而下划线 _,美元符号 $ 在 Lit 中没有特殊的作用(不做操作符或分隔符),所以可以出现在标识符中。
将来规则会逐步放宽,添加 unicode 字符的支持。届时例如 中文标识符 这样的标识符也将可以使用。

注意

Lit 标识符的命名规则要比其他语言宽松非常多!在大多数语言中,只会允许字母、数字和下划线。部分语言支持美元符号。
而 Lit 添加了对于空格的支持。这是一个历史性的突破。原因是在其他传统的语言中,空格也被应用于分隔符,这点是继承了 shell 的风格。例如:

C++
int main() {}

而 Lit 舍弃了这种语法,完全采用标点符号来分隔单词,不把空格作为分隔符。不仅带来了代码风格上的统一,还降低了词法分析的难度,顺便带来将空格作为允许字符这一重大突破。
※在此之前,所有的编程语言均不支持空格标识符。

不能以数字开头

如果可以以数字开头,则整数字面量就是一个标识符。显然这是冲突的。

不能与已有的字面量和关键字冲突

字面量和关键字是一个编程语言的灵魂。由于这两者是在词法分析中就确定了的,而如果标识符将其中一个覆盖,不仅会加大分析的难度,还会导致语义不明。换句话说,这样会导致字面量和关键字失去本来的意义(失去存在的意义)。

区分大小写

这一点没什么可以过多说的。现代编程语言的标识符大多区分大小写

去空格法

这就是比较有意思的一点了。这个规则的做法是,将头尾的空格去掉,中间的多个空格合为一个。这主要是为了避免相似度太高难以区分而造成的意外情况。
例如我定义了一个变量 current line number ,重用时,写作了: current line number。这两个标识实在是太像了。如果把它们当作两个不同的标识符,实在是太容易出现意外了。所以在存储时,一律存储为 current line number,就不容易出现意外了。

有一点小细节,如果你定义了一个全是空格的标识符,那么去完多余空格,该标识符长度为0,违法第一条主要规则。

标识符不可重复声明

呃,,不好说,这是后面的内容。
如果你学过 C 或 C++,那么这样的语句是非法的:

int var;
int var;

这是一种重复声明的情况。

在 Lit 中,以下两种情况也是重复声明:

# 非法:重复声明 #
var -> lit.int = void
var -> lit.int = void
# 重复声明的引申:非子类非字面量赋值
var = lit.int(3)
var = lit.float(3.3)

OK,这就是全部命名规则的具体讲解。
拥有好的命名会使程序更有品味,命名是开发者们永恒探索的话题。

<practice link>