我只是想知道为什么大多数(可能是全部)解释器/编译器不允许在变量的开头使用数字字符?
我的猜测是,当在空格或运算符之后解析数字时,编译器/解释器会将代码视为数字,这样它就可以避免确定代码是/做什么的额外步骤。
那么这个限制背后的真正原因是什么?
我只是想知道为什么大多数(可能是全部)解释器/编译器不允许在变量的开头使用数字字符?
我的猜测是,当在空格或运算符之后解析数字时,编译器/解释器会将代码视为数字,这样它就可以避免确定代码是/做什么的额外步骤。
那么这个限制背后的真正原因是什么?
想象一种 C 派生语言,其中数字可以作为标识符开始。现在编译:
int main(int argc, char **argv) {
int 42L = 42;
long foo = 42L;
/* compiler: is that a long literal or an identifier?
* aaaaaaaaaaaaaaaaaaaaaaargh!!!
*/
}
制作一个能够解决这个问题的编译器非常困难。
但是,可能有标识符可以以数字开头的语言。例如,在您的普通 Lisp 方言中,规则与 C 派生语言非常不同。Lisp 代码主要由带括号的符号/列表组成,例如以下示例:
(defun foo (x y z)
(* (+ x y) (1+ (log z)))) ; Yes, that function is named 1+
对于那些不熟悉 Lisp 的人来说,这相当于:
double foo(double x, double y, double z) {
return (x + y) * (log(z) + 1);
}
Lisp 标识符几乎可以包含任何内容。在 Common Lisp(我选择的方言)中,例外是括号(
)
、反斜杠\
、管道|
、空格(它分隔列表元素)和其他一些。您实际上可以包含它们 - 只需使用反斜杠作为前缀或用管道包围即可。这是一个合法的 Lisp 标识符:
\\foo-|(bar)|-baz\ frobnicator
(尽管我绝对不会将其用作标识符!)