刚与 KLang 作者探讨了一下一个语法设计问题。英文语法中,函数形参的修饰符有 ref、return、scope 三个如下:

int foo(ref return scope n: int)

可以进行各种组合使用,如 return scopereturn ref 等等。那么中文对应语法应该如何设计呢?是这样:

int foo(引用 返回 局部 n: int)

还是用这种缩写呢?

int foo(引返局 n: int)

首先确认了一下,修饰符的排序对语义没有影响,于是先将所有组合列举如下。

引用
返回
局部
引返
引局
返局
引返局

既然排序与语义无关,想到干脆对命名规定一个顺序,这样可以在选词时,挑选一个读起来在各种组合下最通顺的组合,不用麻烦照顾所有顺序。又基于尽量避免缩写的考虑,就变为:

引用
返回
局部
引用 返回
引用 局部
返回 局部
引用 返回 局部

于是变为:

整数 foo(引用 返回 局部 n: 整数)

看起来有些累赘,不妨干脆省去几个空格,同时将顺序作调整以更可读:

引用
返回
局部
返回引用
局部引用
返回局部
返回局部引用

下面是几种设计对比:

int foo(ref return scope n: int)
整数 foo(引用 返回 局部 n: 整数)
整数 foo(返回局部引用 n: 整数)

可以看到,在视觉效果上,中文语法更加简短。

再细想英文语法能否也将几个关键词合为一个短语呢?问题是一旦出现短语,就需要用驼峰或下划线进行分隔,比如:

int foo(refReturnScope n: int)
int foo(ref_return_scope n: int)

看起来,不仅可读性并无改进,而且就有些像标识符而不是关键词。大多数看到的英文编程语言的关键词似乎都是单词或单词缩写(如 elif),恐怕部分原因也是为与标识符作视觉区分。

这个角度说,中文关键词和标识符的视觉区别更小,也许这是好事么?