为什么数字不能用于变量的第一个字符?

时间:2013-04-29 02:59:18

标签: variables compiler-construction interpreter

我只是想知道为什么大多数(也许全部)解释器/编译器在变量的开头不允许使用数字字符?

我的猜测是,当在空格或运算符之后解析一个数字时,编译器/解释器会将代码视为一个数字,这样就可以避免额外的步骤来确定代码是什么/做什么。

那么这种限制背后的真正原因是什么?

1 个答案:

答案 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

(虽然我绝对不会将它用作标识符!)