Existe uma razão pela qual o primeiro elemento de uma matriz Zsh é indexado por 1 em vez de 0?

22

Da minha experiência com modernas linguagens de programação e scripting, acredito que a maioria dos programadores está geralmente acostumada a se referir ao primeiro elemento de uma matriz por 0 como índice.
Existem vantagens substanciais na utilização de 1 ?

Tenho certeza de que já ouvi falar de mais idiomas além de Zsh se comportando de maneira semelhante aos arrays; tudo bem por mim, como é igualmente conveniente.
No entanto, como as linguagens de script shell lançadas anteriormente e amplamente utilizadas, como ksh e bash, usam 0, por que alguém escolheria alterar esse "padrão" comum?

Minha resposta imediata à minha pergunta seria "claro que não"; então, a única explicação que eu posso pensar em relação a este "recurso exclusivo" para os shells seria " eles fizeram isso para mostrar um pouco mais de seu cool shell ".

Não sei muito sobre Zsh ou sua história, e há uma grande chance de minha teoria trivial sobre isso não fazer sentido.

Existe uma explicação para isso? Ou é apenas por gosto pessoal?

    
por deekin 30.12.2015 / 18:11

2 respostas

25
  • Praticamente todos os arrays de shell (Bourne, csh, tcsh, fish, rc, es, yash) começam em 1. ksh é a única exceção que eu conheço (bash apenas copiou ksh).
  • Idiomas mais interpretados no momento (início dos anos 90): awk , tcl pelo menos e ferramentas normalmente usadas no shell ( cut -f1-3 , head -n 3 , sort -k1,3 , cal 1 2015 , comm -1 ) começam em 1. sed , ed , vi numeram suas linhas de 1 ...
  • zsh pega o melhor do shell Bourne e do csh. O conjunto de shell Bourne $@ inicia em 1. zsh é consistente com seu tratamento de $@ (como em Bourne) ou $argv (como em csh). Veja como é confuso em ksh , em que ${@:0:1} não fornece o primeiro parâmetro posicional, por exemplo.
  • Um shell é uma ferramenta do usuário antes de ser uma linguagem de programação. Faz sentido para a maioria dos usuários ter o elemento primeiro em $a[1] . Isso também significa que o número de elementos é o mesmo que o último indice (em zsh, como na maioria das outras shells, exceto ksh, as matrizes não são esparsas).
  • a[1] para o primeiro elemento é consistente com a[-1] para o último.

Então, a pergunta da IMO deve ser: o que deu na cabeça de David Korn para fazer suas matrizes começarem em 0?

    
por 30.12.2015 / 22:04
7

Acho que a resposta mais plausível para isso é a matriz reversa incorporada em zsh

Se você tiver uma matriz com 4 elementos, digamos myvar=(1 2 3 4) e você deseja acessar o 4º elemento, ela será print $myvar[4] , certo?

No entanto, se você quiser criar um loop que listará os elementos dentro desse array de trás para frente, é só uma questão de usar índices negativos:

print $myvar[-1]   # will print 4
print $myvar[-2]   # will print 3
print $myvar[-3]   # will print 2
print $myvar[-4]   # will print 1

Isso deve explicar, já que, a partir do zero, você não alcançará um desses elementos, pois não há -0 .

A segunda razão por trás disso é provavelmente o código C relacionado a variáveis no zsh que está usando int ou double int para definir índices de array, e já que ele usa Complemento de dois para representar números negativos, não há como representar -0 ( Assinado zero ), como você pode fazer em variáveis de ponto flutuante.

Se você está realmente acostumado com índices a partir de 0, sugiro que use a opção KSH_ARRAYS para corrigir isso.

E aproveitando o comentário @cuonglm, os recursos csh implementados em zsh são explicados aqui . Parece não ser uma razão histórica, mas uma maneira de fornecer um ambiente de trabalho confortável para aqueles que são usados com csh

    
por 30.12.2015 / 19:07