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

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

考虑以下:

$ 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

基本上,我试图声明函数1和,0它们将是true和的简写false,但正如您所见,我在函数中使用数字名称时遇到了问题。别名和两位数名称也会出现同样的行为。

问题是“为什么”?这是 POSIX 规定的吗?还是仅仅是 Bourne 类 shell 的一个怪癖?

也可以看看相关问题到这个。

答案1

POSIX 说:

2.9.5 函数定义命令

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

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

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

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

和:

3.235 名称

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

注意:可移植字符集在可移植字符集中有详细定义。

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

答案2

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

考虑:

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

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

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

答案3

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

1000l + 2.0f;

1000l变量还是常量?因为变量名不能以数字开头,所以它必须是常量。这使得解析更容易和更严格(拼写错误如1000k可以轻松发现拼写错误)。变量和函数名也更容易制定单一规则,因为函数也可以被视为变量。现在当然,解析器要复杂得多,功能也强大得多,而且 C++ 中还有自定义文字之类的东西。但在史前时代,牺牲一点不必要的灵活性可能会大大缩短编译(或解释)时间(而且人们仍然在抱怨 C++ 编译时间)。

并且您可以看到 C 影响力贯穿整个 shell 语言,因此 Bourne shell(或 C shell)以及 POSIX 将允许的名称类别限制为与 C 相同也就不足为奇了。

相关内容