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

Рассмотрим следующее:

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

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

10
задан 17 December 2017 в 08:14

3 ответа

POSIX говорит:

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

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

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

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

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

И:

3.235 Имя

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

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

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

14
ответ дан 17 December 2017 в 08:14

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

Рассмотрим:

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

Как вы можете видеть, если числа были разрешены как имена переменных или функций, выполнение математических вычислений в дальнейшем может стать очень запутанным, и вам придется придумать с творческими обходными путями, если позже вам понадобится сделать математику с этими числами. Это также может привести к неожиданным результатам на некоторых языках. Представьте, что вы увеличиваете число для цикла, но одна из цифр уже является переменной, равной строке. Это немедленно бросило бы ошибку. Если вы не были первоначальным автором кода, эта ошибка может занять много времени.

В двух словах, именно поэтому большинство языков не позволяют использовать число в качестве имени переменной, функции, метода и т. Д.

13
ответ дан 17 December 2017 в 08:14

В C рассмотрим выражение вроде:

1000l + 2.0f;

Является ли 1000l переменной или константой? Поскольку имена переменных не могут начинаться с цифры, это должна быть константа. Это делает анализ более простым и строгим (опечатки типа 1000k могут быть легко обнаружены). Также проще иметь единое правило для переменных и имен функций, поскольку функции также могут рассматриваться как переменные. Теперь , конечно, парсеры намного сложнее и мощнее, и у нас есть такие вещи, как пользовательские литералы в C ++. Но в те древние времена доисторического периода, когда мы жертвовали излишней гибкостью, время компиляции (или интерпретации) значительно сокращалось (и люди все еще жалуются на время компиляции C ++).

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

10
ответ дан 17 December 2017 в 08:14

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

Похожие вопросы: