我只是想知道为什么大多数(也许全部)解释器/编译器在变量的开头不允许使用数字字符?
我的猜测是,当在空格或运算符之后解析一个数字时,编译器/解释器会将代码视为一个数字,这样就可以避免额外的步骤来确定代码是什么/做什么。
那么这种限制背后的真正原因是什么?
答案 0 :(得分:3)
想象一下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
(虽然我绝对不会将它用作标识符!)