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]

Isto acontece pois você está concatenando uma list com algo que não é uma list, o resultado que você vê é uma improper list, não tem tantos usos e é algo a ser evitado. Para mais informações você pode dar uma olhada aqui e aqui.

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:

Linked List

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.