Dúvida no Elixir
Fala turma,
comecei a estudar Elixir e achei um negócio estranho quando tentei fazer algo
iex(9)> lista = [1,2,3,4] [1, 2, 3, 4] iex(10)> [0 | lista] [0, 1, 2, 3, 4] iex(11)> lista ++ [5] [1, 2, 3, 4, 5] iex(12)> lista [1, 2, 3, 4] iex(13)> lista = [0 | lista] [0, 1, 2, 3, 4] iex(14)> lista [0, 1, 2, 3, 4] iex(15)> lista = lista ++ 5 [0, 1, 2, 3, 4 | 5]
alguém têm ideia do porque disso >> [0, 1, 2, 3, 4 | 5]
O comentário do @julianolorenzato
está correto e acho que já reponde sua dúvida. Mas aqui vai uma curiosidade legal.
Em elixir listas são o que chamamos de listas ligadas, ou linked lists. E em muitos lugares você vai achar a seguinte representação para uma lista dessas:
Cada "nó" dessa lista em linguagens funcionais é chamado de Par ou Pair. Onde o primeiro campo do par possui o valor do nó e o segundo em geral é um ponteiro para outro par. Por isso a chamamos de lista ligada. Sabemos onde é o fim da lista quando chegamos no par em que a segunda componente é nula. Por isso em muitas linguagens funcionais null (ou nil) e uma lista vazia são a mesma coisa. Se não me engano elixir é uma delas.
Mas o que acontece se o segundo slot do par não for preenchido com outro par? Bom, aí você tem o caso que você viu. Esse tipo de par não é necessariamente inútil. Em alguns dialetos de Lisp listas como essa em elixir: [[:a | 1], [:b | 2]]
. São chamadas de listas associativas. E seria utilizadas de forma similar a maps ou dicionários.
Em Elixir não há necessidade de utilizá-las pós você já possui os maps que são mais eficientes. O que me intriga e confesso que não conheço são as chamadas keyword lists. Que talvez utilizem essa técnica. Bom uma vez que você está estudando a linguagem, talvez você mesmo possa descobrir.