为什么不允许使用数字函数名?

考虑以下:

$ ksh -c '1(){ echo hi;};1' ksh: 1: invalid function name $ dash -c '1(){ echo hi;};1' dash: 1: Syntax error: Bad function name $ bash -c '1(){ echo hi;};1' bash: `1': not a valid identifier bash: 1: command not found $ mksh -c '1(){ echo hi;};1' hi 

基本上,我试图声明函数10 ,它们对于truefalse都是shorthands,但是你可以看到我在函数中使用数字名称时遇到了问题。 别名和两位数名称会出现相同的行为。

问题是“为什么”? 它是由POSIX强制执行的吗? 或者只是像伯恩一样的贝壳的怪癖?

另见相关问题 。

POSIX说:

2.9.5function定义命令

函数是用户定义的名称,用作使用新位置参数调用复合命令的简单命令。 使用“函数定义命令”定义函数。

函数定义命令的格式如下:

  fname ( ) compound-command [io-redirect ...] 

该函数名为fname ; 应用程序应确保它是一个名称(请参阅XBD 名称 ),并且它不是特殊内置实用程序的名称。 实现可以允许函数名中的其他字符作为扩展名。 实现应为函数和变量维护单独的名称空间。

和:

3.235名称

在shell命令语言中,单词由可移植字符集中的下划线,数字和字母组成。 名称的第一个字符不是数字。

注意:便携式字符集在便携式字符集中详细定义。

因此,以数字开头的单词不能是函数名称。

这是许多语言的标准,以防止数学运算与变量或函数或方法之间的混淆。

考虑:

 var 1 = 100 print 1*10 //should return 10 but would instead return 1000 var x = 5 x += 1 print x //returns 105, not 6 def 100(num) return num * 1000 end var y = 10 + 100(10) print y // returns 100010 instead of 1010 

正如您所看到的,如果允许数字作为变量或函数名称,稍后在程序中进行数学运算可能会变得非常混乱,如果您以后需要实际使用这些数字进行数学计算,则必须提出创造性的解决方法。 它还可能在某些语言中产生意外结果。 想象一下,您正在为循环增加一个数字,但其中一个数字已经是一个等于字符串的变量。 它会立即引发错误。 如果您不是代码的原始作者,那么该错误可能需要很长时间才能找到。

简而言之,这就是大多数语言不允许您使用数字作为变量或函数或方法等的名称的原因。

在C中,考虑如下表达式:

 1000l + 2.0f; 

1000l是变量还是常量? 因为变量名不能以数字开头,所以它必须是常量。 这使得解析更容易和更严格(像1000k这样的拼写错误很容易被捕获)。 对变量和函数名称使用单个规则也更容易,因为函数也可以视为变量。 当然,解析器更加复杂和强大,我们在C ++中有自定义文字这样的东西。 但回到史前时代,牺牲一些不必要的灵活性可能会使你的编译(或解释)时间缩短(人们仍抱怨C ++编译时间)。

并且您可以在整个shell语言中看到C影响的影响,因此Bourne shell(或C shell)以及POSIX将允许的类的类限制为与C的相同并不奇怪。