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

27

Pela minha experiência com linguagens de programação e script modernas, acredito que a maioria dos programadores costuma estar acostumada a se referir ao primeiro elemento de uma matriz por 0 como índice.
Existem vantagens substanciais no uso de 1 ?

Tenho certeza que já ouvi falar de mais idiomas além do Zsh se comportando de maneira semelhante com matrizes; por mim tudo bem, pois é igualmente conveniente.
No entanto, como as linguagens de script de shell lançadas anteriormente e amplamente usadas, 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 posso pensar sobre esse "recurso exclusivo" das conchas seria " elas apenas fizeram isso para mostrar um pouco mais sua casca fria ".

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

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

deekin
fonte
5
Alguma pesquisa histórica (ou ruminações desenfreadas?) Sobre o tópico 0 versus 1: exple.tive.org/blarg/2013/10/22/citation-needed
thrig
Por razões históricas, isso provavelmente veio csh, que também usava indexação de matriz baseada em um.
cuonglm
3
Atualmente, sh é uma linguagem padrão (não uma implementação) que possui diferentes intérpretes possíveis. Alguns desses intérpretes para a linguagem sh, como bash, ksh e yash, oferecem suporte a matrizes como extensão, mas eles não fazem parte da linguagem, assim como o gcc, um compilador para a linguagem C padrão suporta extensões na linguagem C padrão. E, assim como para C, não há implementação "oficial" de um intérprete "sh".
Stéphane Chazelas
11
Relacionado - comentários nesta resposta do PPCG
Digital Trauma
4
Talvez um pouco fora de tópico, mas relevante. Os romanos usavam a contagem inclusiva, encarando uma em vez de zero. Depois de amanhã, para nós "dois dias à frente", era para eles "três dias à frente". Eles contaram hoje como um, não zero. Como conseqüência, quando seus astrônomos egípcios recomendaram um dia bissexto a cada quatro anos, os romanos realmente o introduziam a cada três anos, começando em 45 aC. Demorou até 12 aC para que o erro fosse corrigido.
Harry Weston

Respostas:

32
  • Praticamente todas as matrizes de shell (Bourne, csh, tcsh, fish, rc, es, yash) começam em 1. ksh é a única exceção que eu conheço (o bash apenas copiou o ksh).
  • Línguas mais interpretados na época (início dos anos 90): awk, tclpelo menos, e ferramentas normalmente utilizadas a partir do shell ( cut -f1-3, head -n 3, sort -k1,3, cal 1 2015, comm -1) começam em 1. sed, ed, vinúmero de suas linhas de 1 ...
  • O zsh tira o melhor proveito do shell Bourne e do csh. O array de shell Bourne $@começa em 1. zsh é consistente com o manuseio de $@(como em Bourne) ou $argv(como em csh). Veja como é confuso kshonde ${@: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 primeiro elemento $a[1]. Isso também significa que o número de elementos é igual ao último índice (no zsh, como na maioria dos outros shells, exceto no ksh, os arrays não são escassos).
  • a[1]pois o primeiro elemento é consistente com a[-1]o último.

Então, na IMO, a pergunta deveria ser: o que entrou na cabeça de David Korn para fazer com que suas matrizes começassem com 0?

Stéphane Chazelas
fonte
7
É um erro nas linguagens humanas que a numeração seja baseada em um, e um acaso notável que a maioria das linguagens de programação conseguiu manter esse legado fora de seu design. O mais triste é que, depois que a indexação baseada em zero foi praticamente estabelecida como padrão, muitas linguagens "orientadas ao usuário" conseguiram retroceder, tentando ser "mais simples" usando a indexação incorreta e baseada novamente. - Dito isto: a melhor maneira de evitar a confusão da indexação é, obviamente, evitar inteiramente os índices numéricos.
leftaroundabout
Lendo aqui: "Ao lidar com uma sequência de comprimento N, cujos elementos desejamos distinguir por subscrito, ... a) gera, ao iniciar com o subscrito 1, o intervalo de subscrito 1 ≤ i <N + 1; começando com 0, no entanto, fornece o intervalo melhor de 0 ≤ i <N . " . Não sei se TROLL ou ESTÚPIDO, mas você pode usar "1 ≤ i ≤ N" para subscritos que começam com 1 em matrizes. Não é necessário colocar esse +1 no final da varredura da matriz, e nenhum dos pontos de vista prova que os índices iniciais com 1 ou 0 são melhores.
11
Você pode justificar que 0 foi adicionado DEPOIS do conhecimento humano e, de alguma maneira, atrapalhou as coisas nessa época. theguardian.com/notesandqueries/query/0,5753,-1358,00.html - Mais uma vez, é apenas uma questão de ponto de vista :) #
3
A matriz de shell Bourne $ @ começa em 0 (não 1) $ 0 é o nome do programa que você está executando. você deve corrigir o seu terceiro ponto
Edward Torvalds
2
@edwardtorvalds, Não, $0não é um parâmetro posicional. Não faz parte $@. "$@"é "$1" "$2" .... Quando se trata de funções, em muitas conchas, você vê que "$@"são os argumentos para a função, enquanto $0estadias o caminho do script (ou argv shell [0] quando não estiver executando um script)
Stéphane Chazelas
7

Eu acho que a resposta mais plausível para isso é a matriz reversa embutida zsh

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

No entanto, se você deseja criar um loop que listará os elementos dentro dessa matriz de trás para frente, é apenas 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 às variáveis ​​no zsh está usando intou double intpara definir índices de matriz, e como ele usa o complemento de dois para representar números negativos, não há como representar -0( zero assinado ), como você pode fazer no float variáveis ​​pontuais.

Se você está realmente acostumado a índices começando em 0, sugiro que você use a KSH_ARRAYSopção para corrigir isso.

E, tomando conta do comentário do @cuonglm, os cshrecursos implementados zshsão explicados aqui . Parece não ser uma razão histórica, mas uma maneira de proporcionar um ambiente de trabalho confortável para aqueles que são usados ​​comcsh


fonte
3
Então, isso deve fazer você acessar o primeiro e o último item da matriz ao mesmo tempo, quebrando toda a lógica de varrer uma matriz;) Pode até criar um buraco negro. LOL
3
para matrizes indexadas em 0, substitua -por ~.
mikeserv
11
@ mfxx - eu estava falando bash. Eu acho que ele lida com índices negativos para elementos do conjunto como açúcar de sintaxe, mas depois não o faz de outra forma. não consigo lembrar. da minha perspectiva, as pessoas devem apenas criar um diretório e usar arquivos para o que quer que estejam inserindo em todo esse estado de shell. você pode indexar esses elementos da maneira que desejar.
mikeserv
11
~é inversão binária. ~0é -1. (todos os bits invertidos dependem de como os números negativos geralmente são representados em bits). Em uma matriz não configurada ou em uma matriz com apenas um elemento do índice 0, a [0], a [-0], a [-1] e a [~ 0] fornecerão a mesma coisa em uma matriz semelhante a ksh.
Stéphane Chazelas
11
@ StéphaneChazelas - sim, acho que me lembro de lidar com isso ~quando -indexnão funcionou. Acho que provavelmente tudo o que fiz foi ~-index. sim. isso parece certo. sim! e é claro que também funciona para elementos não configurados. então eu acho que o comentário acima deve ser - para matrizes 0 indexadas adicionar ~ . Eu acho que apenas lidou com a parte -1 mais fácil, talvez. Não sei. não está pulando para a vanguarda da minha memória no momento ...
mikeserv 30/12/2015