Рассмотрим следующее:
$ 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? или просто причуда борнеподобных оболочек?
См. также связанный с этим вопрос.
POSIX говорит:
2.9.5 Функция Определение команды Функция - это определяемое пользователем имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами. Функция определяется с помощью команды определения функции. Формат команды определения функции выглядит следующим образом: fname ( ) compound-command [io-redirect ...]
Функция называется fname; приложение должно гарантировать, что это имя (см. XBD Name) и что это не имя специальной встроенной утилиты. Реализация может допускать использование других символов в имени функции в качестве расширения. Реализация должна поддерживать отдельные пространства имен для функций и переменных. И:
Функция - это определяемое пользователем имя, которое используется как простая команда для вызова составная команда с новыми позиционными параметрами. Функция определена с помощью команды определения функции.
Примечание. Набор переносных символов подробно описан в переносном наборе символов.В командном языке оболочки слово, состоящее исключительно из символов подчеркивания, цифр и алфавитов из переносного набора символов. Первый символ имени не является цифрой.
POSIX говорит:
2.9.5 Функция Определение команды Функция - это определяемое пользователем имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами. Функция определяется с помощью команды определения функции. Формат команды определения функции выглядит следующим образом: fname ( ) compound-command [io-redirect ...]
Функция называется fname; приложение должно гарантировать, что это имя (см. XBD Name) и что это не имя специальной встроенной утилиты. Реализация может допускать использование других символов в имени функции в качестве расширения. Реализация должна поддерживать отдельные пространства имен для функций и переменных. И:
Функция - это определяемое пользователем имя, которое используется как простая команда для вызова составная команда с новыми позиционными параметрами. Функция определена с помощью команды определения функции.
Примечание. Набор переносных символов подробно описан в переносном наборе символов.В командном языке оболочки слово, состоящее исключительно из символов подчеркивания, цифр и алфавитов из переносного набора символов. Первый символ имени не является цифрой.
POSIX говорит:
2.9.5 Функция Определение команды Функция - это определяемое пользователем имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами. Функция определяется с помощью команды определения функции. Формат команды определения функции выглядит следующим образом: fname ( ) compound-command [io-redirect ...]
Функция называется fname; приложение должно гарантировать, что это имя (см. XBD Name) и что это не имя специальной встроенной утилиты. Реализация может допускать использование других символов в имени функции в качестве расширения. Реализация должна поддерживать отдельные пространства имен для функций и переменных. И:
Функция - это определяемое пользователем имя, которое используется как простая команда для вызова составная команда с новыми позиционными параметрами. Функция определена с помощью команды определения функции.
Примечание. Набор переносных символов подробно описан в переносном наборе символов.В командном языке оболочки слово, состоящее исключительно из символов подчеркивания, цифр и алфавитов из переносного набора символов. Первый символ имени не является цифрой.
Это стандарт на многих языках, чтобы предотвратить путаницу между математическими операциями и переменными или функциями или методами.
Рассмотрим:
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.
Это стандарт на многих языках, чтобы предотвратить путаницу между математическими операциями и переменными или функциями или методами.
Рассмотрим:
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.
Это стандарт на многих языках, чтобы предотвратить путаницу между математическими операциями и переменными или функциями или методами.
Рассмотрим:
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.