0

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

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

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

4

1 回答 1

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

(尽管我绝对不会将其用作标识符!)

于 2013-04-29T03:15:46.917 回答