为什么编程语言不允许标识符中的空格?

Osc*_*Ryz 7 language-agnostic language-design

这似乎是一个愚蠢的问题,但我仍然不知道答案.

为什么编程语言不允许名称中的空格(例如方法名称)?

我理解它是为了促进(允许)解析,并且在某些时候,如果允许空格则不可能解析任何东西.

如今我们如此习惯于规范不是看空间.

例如:

 object.saveData( data );
 object.save_data( data )
 object.SaveData( data );
 [object saveData:data];
Run Code Online (Sandbox Code Playgroud)

等等

可以写成:

 object.save data( data )  // looks ugly, but that's the "nature" way.
Run Code Online (Sandbox Code Playgroud)

如果只是用于分析,我猜的标识可能是之间.(当然,程序语言将无法使用它,因为没有"" 但OO呢..

我不知道如果解析是唯一的原因,如果是,这是多么重要的(我认为这将是,这将是不可能做到这一点,否则,除非所有的编程语言的设计者只是......忘了选项)

编辑

我对标识符一般都很好(因为fortran示例)是个坏主意.缩小到OO语言,特别是方法,我没有看到(我不是说没有)这是为什么它应该是这样的原因.毕竟可以使用.和第一个(.

忘记saveData方法,考虑这个:

key.ToString().StartsWith("TextBox")
Run Code Online (Sandbox Code Playgroud)

如:

key.to string().starts with("textbox");
Run Code Online (Sandbox Code Playgroud)

Jay*_*ggs 51

因为我真的很困难.

  • 这是我第一次提出答案,即IMO,这是错误的. (8认同)
  • 具有讽刺意味的是,大多数人都没有解析此文本的问 不好的例子.:P (7认同)
  • +1让我笑,同时给出正确的答案XD (4认同)

wal*_*lyk 14

我使用了ALGOL(c.1978)的实现,它非常烦人地要求引用现在称为保留字的内容,并允许标识符中的空格:

  "proc" filter = ("proc" ("int") "bool" p, "list" l) "list":
     "if" l "is" "nil" "then" "nil"
     "elif" p(hd(l)) "then" cons(hd(l), filter(p,tl(l)))
     "else" filter(p, tl(l))
     "fi";
Run Code Online (Sandbox Code Playgroud)

此外,FORTRAN(大写形式表示F77或更早版本)对空格或多或少不敏感.所以这可以写成:

  799 S = FLO AT F (I A+I B+I C) / 2 . 0
      A  R E  A = SQ R T ( S *(S - F L O ATF(IA)) * (S - FLOATF(IB)) *
     +     (S - F LOA TF (I C)))
Run Code Online (Sandbox Code Playgroud)

这在语法上是相同的

  799 S = FLOATF (IA + IB + IC) / 2.0
      AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
     +     (S - FLOATF(IC)))
Run Code Online (Sandbox Code Playgroud)

有了这种滥用的历史,为什么要为人类解析困难?更不用说复杂的计算机解析了.

  • 更不用说:DO 10 I = 1.10(分配)和DO 10 I = 1,10(DO循环的开始). (2认同)

jpr*_*ete 8

是的,它是解析 - 人类和计算机.如果您可以安全地假设空白无关紧要,则更容易阅读并且更容易解析.否则,您可能会有可能含糊不清的陈述,不清楚事情如何在一起的陈述,难以阅读的陈述等.


Gre*_*ill 5

在最好的情况下,这种改变会使语言模糊不清.例如,在类似C99的语言中:

if not foo(int x) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

相当于:

  1. 函数定义foo返回类型的值ifnot:

    ifnot foo(int x) {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用名为notfoo的变量调用函数的调用intx:

    if notfoo(intx) {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对函数的否定调用foo(使用C99 not表示!):

    if not foo(intx) {
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

这只是您可能遇到的含糊不清的一小部分样本.

更新:我刚刚注意到,很明显,在类似C99的语言中,if语句的条件将括在括号中.如果您选择忽略空格,额外的标点符号可以帮助解决歧义,但是无论您通常使用空格,您的语言最终都会有很多额外的标点符号.

  • 而且你还需要大量的前瞻才能意识到它不是对一个名为"if not foo"的函数的调用. (2认同)

CBF*_*ser 4

在解释器或编译器可以构建解析树之前,它必须执行词法分析,将字符流转换为令牌流.考虑如何解析以下内容:

a = 1.2423 /(4343.23*2332.2);

以及你的规则如何对其起作用.很难知道如何在不理解令牌含义的情况下对它进行词法化.构建一个同时执行lexification的解析器真的很难.

  • +1.我的令牌不是"保存数据",因为它位于`.`和`之间(``反过来怎么样?我知道编译器没有问题:`a = 1.2423 /(4343.23*2332.2); a = a + a;`(根本没有空格) (2认同)
  • 它不必是单个令牌.它可以被解析为两个不同的标记,然后解析器查看上下文并确定它们是否应该组成一个单独的名称.根据语言的语法,它甚至可能是明确的.所以不是真正的实施问题. (2认同)