Почему числовые имена функций не допускаются?

Учтите следующее:

$ 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? или просто причудливые раковины?

Смотрите также связанный с этим вопрос.

3 ответа

Решение

POSIX говорит:

2.9.5 Команда определения функции

Функция - это пользовательское имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами. Функция определяется с помощью "команды определения функции".

Формат команды определения функции следующий:

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

Функция называется fname; приложение должно убедиться, что это имя (см. Имя XBD) и что это не имя специальной встроенной утилиты. Реализация может разрешить другие символы в имени функции в качестве расширения. Реализация должна поддерживать отдельные пространства имен для функций и переменных.

А также:

3.235 Имя

В языке команд оболочки слово, состоящее исключительно из символов подчеркивания, цифр и алфавита из переносимого набора символов. Первый символ имени не является цифрой.

Примечание. Портативный набор символов подробно описан в разделе "Портативный набор символов".

Таким образом, слово, начинающееся с цифры, не может быть именем функции.

Это стандарт во многих языках для предотвращения путаницы между математическими операциями и переменными или функциями или методами.

Рассматривать:

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++).

И вы можете видеть влияние влияния C на язык оболочки, поэтому неудивительно, что оболочка Bourne (или оболочка C) и, следовательно, POSIX, ограничивают класс разрешенных имен тем же, что и класс C.

Другие вопросы по тегам