Eu entendi que por erro vc quis dizer "decisão errada que não veio de Erlang", mas não dá para concluir isso comparando Enum.at com lists:nth, pois como já podemos ver pelos nomes, são completamente diferentes.
A descrição de Enum.at é:
Finds the element at the given index (zero-based).
"Encontra o elemento no índice fornecido".
Se eu escrevo Enum.at([:a, :b, :c, :d, :e],3) eu não estou dizendo "me dá o terceiro elemento", estou dizendo "me dá o elemento que está no índice 3", e já que índice começa no 0, é esperado que o resultado seja :d.
Já a descrição de lists:nth é:
Returns the Nth element of List.
"Retorna o enésimo elemento da lista".
Se eu escrevo lists:nth(3, [a, b, c, d, e]) estou dizendo que quero o terceiro elemento.
Ou seja, Enum.at faz exatamente o que o nome sugere e a documentação descreve.
Acesso a arrays baseado em zero não é erro - é um legado da forma como se indexa em C. É uma consequência da forma como "aritmética de ponteiros" funciona, e que é - pra quem trabalha com C e outras linguagens mais "perto do metal" - a maneira mais "natural" de pensar nesse tipo de indexação.
Em outras palavras: não é um erro, é uma escolha. Pode-se até argumentar que seja uma escolha ruim (ou que seja anacrônica ou contraproducente numa linguagem mais "abstrata"), mas é uma escolha que tem razão de existir e vários argumentos a favor (e contra).
Eu entendi que por erro vc quis dizer "decisão errada que não veio de Erlang", mas não dá para concluir isso comparando
Enum.at
comlists:nth
, pois como já podemos ver pelos nomes, são completamente diferentes.A descrição de
Enum.at
é:"Encontra o elemento no índice fornecido".
Se eu escrevo
Enum.at([:a, :b, :c, :d, :e],3)
eu não estou dizendo "me dá o terceiro elemento", estou dizendo "me dá o elemento que está no índice 3", e já que índice começa no 0, é esperado que o resultado seja:d
.Já a descrição de
lists:nth
é:"Retorna o enésimo elemento da lista".
Se eu escrevo
lists:nth(3, [a, b, c, d, e])
estou dizendo que quero o terceiro elemento.Ou seja,
Enum.at
faz exatamente o que o nome sugere e a documentação descreve.Eu chamaria apenas de "decisão errada". O fato de ter vindo de Erlang ou não pouco importa.
Erlang não tem um
Enum
, certo? O mais próximo deEnum
, mas que é conceitualmente diferente, élists
.Não faz diferença no que eu considero "erro" o fato da documentação da função
Enum.at
descrever exatamente o que ela faz. Não é um bug.O "erro" (sempre entre aspas) se repete em Elixir no módulo
List
, nas funçõesdelete_at
,pop_at
e provavelmente outras.Nada que me impeça de amar Elixir.
Acesso a arrays baseado em zero não é erro - é um legado da forma como se indexa em C. É uma consequência da forma como "aritmética de ponteiros" funciona, e que é - pra quem trabalha com C e outras linguagens mais "perto do metal" - a maneira mais "natural" de pensar nesse tipo de indexação.
Em outras palavras: não é um erro, é uma escolha. Pode-se até argumentar que seja uma escolha ruim (ou que seja anacrônica ou contraproducente numa linguagem mais "abstrata"), mas é uma escolha que tem razão de existir e vários argumentos a favor (e contra).
Contar começando de 0 pra mim, que vejo do ponto de vista de um programador iniciante, é um erro. Mas é um erro bem pequeno, um "errinho".
O "hardware não sabe o que são matrizes. Arrays costumavam começar com 1. C decidiu fazer array igual a um espaço na memória e, portanto, a indexação por zero fazia sentido."
"Porque o mal que C impingiu ao mundo não se enraizou em todos os lugares? Fortran, LISP e Smalltalk começaram com 1. New Jersey começou com 0."
Mark Guzdial