Por que os nomes das funções numéricas não são permitidos?

10

Considere o seguinte:

$ 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

Basicamente, eu estava tentando declarar as funções 1 e 0 , que seriam atalhos para true e false , mas como você pode ver, tive problemas com o uso de nomes numéricos em funções. O mesmo comportamento ocorre com aliases e nomes de dois dígitos.

A pergunta é "por que"? É mandatado por POSIX? ou apenas uma peculiaridade de conchas parecidas com bourne?

Veja também questão relacionada para esta.

    
por Sergiy Kolodyazhnyy 19.11.2017 / 03:39

3 respostas

14

POSIX diz:

  

2.9.5 Comando de definição de função

     

Uma função é um nome definido pelo usuário que é usado como um comando simples para   chame um comando composto com novos parâmetros posicionais. Uma função é   definido com um "comando de definição de função".

     

O formato de um comando de definição de função é o seguinte:

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

A função é nomeada fname ; o pedido deve assegurar que é   um nome (veja XBD Nome ) e que é não o nome de um especial   utilitário embutido. Uma implementação pode permitir que outros caracteres em um   nome da função como uma extensão. A implementação deve manter   espaços de nome separados para funções e variáveis.

E:

  

3.235 Nome

     

Na linguagem de comando shell, uma palavra que consiste apenas em   sublinhados, dígitos e alfabéticos do conjunto de caracteres portátil.   O primeiro caractere de um nome não é um dígito.

     

Nota: O conjunto de caracteres portátil é definido em detalhes no Portable   Conjunto de caracteres.

Assim, uma palavra que começa com um dígito não pode ser um nome de função.

    
por muru 19.11.2017 / 03:59
13

Esse é um padrão em muitos idiomas para evitar confusão entre operações matemáticas e variáveis ou funções ou métodos.

Considere:

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

Como você pode ver, se os números fossem permitidos como variáveis ou nomes de função, fazer matemática posteriormente em um programa poderia se tornar muito confuso e você teria que criar soluções criativas se precisasse fazer matemática com esses números mais tarde em. Também pode produzir resultados inesperados em alguns idiomas. Imagine que você está incrementando um número para um loop, mas um dos dígitos já é uma variável igual a uma string. Ele imediatamente lançaria um erro. Se você não fosse o autor original do código, esse erro poderia demorar um pouco para ser encontrado.

Em suma, é por isso que a maioria dos idiomas não permite que você use um número como o nome de uma variável ou função ou método ou etc.

    
por Josh 19.11.2017 / 05:14
10

Em C, considere uma expressão como:

1000l + 2.0f;

1000l é uma variável ou uma constante? Como os nomes das variáveis não podem começar com um dígito, ele deve ser uma constante. Isso torna a análise mais fácil e mais rígida (erros de digitação como 1000k podem ser capturados com facilidade). Também é mais fácil ter uma única regra para variáveis e nomes de funções, já que as funções também podem ser tratadas como variáveis. Agora , é claro, os analisadores são muito mais complexos e poderosos, e temos coisas como literais customizados em C ++. Mas naqueles dias antigos da pré-história, sacrificar um pouco de flexibilidade desnecessária poderia tornar sua compilação (ou interpretação) vezes mais curta (e as pessoas ainda reclamam dos tempos de compilação do C ++).

E você pode ver os efeitos de uma influência de C em toda a linguagem shell, portanto não é surpresa que o shell Bourne (ou shell C) e, portanto, POSIX, tenha restringido a classe de nomes permitidos ao mesmo que C .

    
por Olorin 19.11.2017 / 04:53