web-dev-qa-db-ja.com

数値関数名が許可されないのはなぜですか?

以下を考慮してください。

$ 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

基本的には、truefalseの短縮形になる関数10を宣言しようとしましたが、ご覧のとおり、機能。エイリアスと2桁の名前でも同じ動作が発生します。

質問は「なぜ」ですか? POSIXによって義務付けられていますか?それとも、ボーンのようなシェルのちょっとした癖ですか?

関連する質問 も参照してください。

10

POSIX言う:

2.9.5関数定義コマンド

関数は、新しい定位置パラメーターを使用して複合コマンドを呼び出すための単純なコマンドとして使用されるユーザー定義の名前です。関数は「関数定義コマンド」で定義されます。

関数定義コマンドの形式は次のとおりです。

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

関数の名前はfname;アプリケーションは、それが名前であることを確認しなければなりません(XBD Name を参照)、それが特別なビルドの名前ではないこと-inユーティリティ。実装では、関数名に他の文字を拡張として使用できます。実装では、関数と変数の個別の名前空間を維持するものとします。

そして:

.235名前

シェルコマンド言語で、ポータブル文字セットのアンダースコア、数字、およびアルファベットのみで構成されるWord。名前の最初の文字は数字ではありません。

注:ポータブル文字セットは、ポータブル文字セットで詳細に定義されています。

したがって、数字で始まるWordを関数名にすることはできません。

14
muru

これは、数学演算と変数または関数またはメソッドとの間の混乱を防ぐための多くの言語の標準です。

考慮してください:

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

ご覧のように、数値が変数名または関数名として許可されている場合、後でプログラムで数学を実行すると非常に混乱する可能性があり、それらの数値で実際に数学を実行する必要がある場合は、創造的な回避策を考え出す必要があります。また、一部の言語では予期しない結果が生じる可能性があります。ループの数を増やしているが、数字の1つが既に文字列に等しい変数であると想像してください。すぐにエラーがスローされます。コードの元の作成者でない場合、そのエラーを見つけるまでにかなり時間がかかる可能性があります。

簡単に言えば、これが、ほとんどの言語で変数や関数、メソッドなどの名前として数字を使用することを許可していない理由です。

13
Josh

Cでは、次のような式を考えます。

1000l + 2.0f;

1000lは変数ですか、それとも定数ですか?変数名は数字で始めることができないため、定数でなければなりません。これにより、解析がより簡単かつ厳密になります(1000kなどのタイプミスは簡単に捕捉できます)。関数も変数として扱うことができるため、変数と関数名に単一のルールを設定する方が簡単です。 現在もちろん、パーサーははるかに複雑で強力であり、C++のカスタムリテラルのようなものがあります。しかし、古代の先史時代に戻って、不必要な柔軟性を少し犠牲にすると、コンパイル(または解釈)時間がはるかに短くなる可能性があります(そして、人々はC++のコンパイル時間について文句を言います)。

また、シェル言語全体でCの影響の影響を確認できるため、Bourne Shell(またはC Shell)、したがってPOSIXが許可された名前のクラスをCのクラスと同じものに制限していることは驚くことではありません。

10
Olorin