Considérer ce qui suit:
$ 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
Essentiellement, j'essayais de déclarer les fonctions 1
et 0
qui seraient des raccourcis pour true
et false
, mais comme vous pouvez le constater, des problèmes d’utilisation de noms numériques ont été rencontrés dans les fonctions. Le même comportement se produit avec des alias et des noms à deux chiffres.
La question est "pourquoi"? Est-ce mandaté par POSIX? ou juste une bizarrerie de coquilles en forme de bourne?
Voir aussi question connexe à celle-ci.
POSIX dit:
2.9.5 Commande de définition de fonction
Une fonction est un nom défini par l'utilisateur utilisé comme commande simple pour appeler une commande composée avec de nouveaux paramètres de position. Une fonction est définie avec une "commande de définition de fonction".
Le format d’une commande de définition de fonction est le suivant:
fname ( ) compound-command [io-redirect ...]
La fonction s'appelle fname ; l’application doit s’assurer que c’est un nom (voir XBD Nom ) et qu’il ne s’agit pas du nom d’une construction spéciale. -en utilité. Une implémentation peut autoriser d'autres caractères dans un nom de fonction en tant qu'extension. L'implémentation doit maintenir des espaces de noms séparés pour les fonctions et les variables.
Et:
Nom 3.235
Dans le langage de commande du shell, mot composé uniquement de traits de soulignement, de chiffres et d’alphabets issus du jeu de caractères portable. Le premier caractère d'un nom n'est pas un chiffre.
Remarque: le jeu de caractères portable est défini en détail dans le jeu de caractères portable.
Ainsi, un mot commençant par un chiffre ne peut pas être un nom de fonction.
C’est un standard dans de nombreuses langues pour éviter toute confusion entre opérations mathématiques et variables ou fonctions ou méthodes.
Considérer:
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
Comme vous pouvez le constater, si les nombres étaient autorisés en tant que noms de variables ou de fonctions, faire des calculs plus tard dans un programme pourrait devenir très déroutant et vous auriez à trouver des solutions de contournement créatives si vous aviez besoin de faire ces calculs plus tard. Il peut également produire des résultats inattendus dans certaines langues. Imaginez que vous incrémentez un nombre pour une boucle, mais que l'un des chiffres soit déjà une variable égale à une chaîne. Cela provoquerait immédiatement une erreur. Si vous n'étiez pas l'auteur original du code, cette erreur pourrait prendre un certain temps à trouver.
En un mot, c’est la raison pour laquelle la plupart des langues ne vous autorisent pas à utiliser un nombre comme nom d’une variable, d’une fonction, d’une méthode, etc.
En C, considérons une expression comme:
1000l + 2.0f;
1000l
est-il une variable ou une constante? Comme les noms de variables ne peuvent pas commencer par un chiffre, il doit être une constante. Cela rend l'analyse plus facile et plus stricte (des fautes de frappe telles que 1000k
peuvent être facilement interceptées). Il est également plus facile d'avoir une seule règle pour les variables et les noms de fonctions, car les fonctions peuvent également être traitées comme des variables. Maintenant bien sûr, les analyseurs sont beaucoup plus complexes et puissants, et nous avons des choses comme les littéraux personnalisés en C++. Mais à l'époque antique de la préhistoire, sacrifier un peu de flexibilité inutile pourrait rendre votre compilation (ou interprétation) beaucoup plus courte (et les gens se plaignent encore des temps de compilation C++).
Et vous pouvez voir les effets d'une influence C dans le langage Shell. Il n'est donc pas surprenant que Bourne Shell (ou C Shell) et, par conséquent, POSIX, a limité la classe de noms autorisés à la même classe que celle de C.