Lista VS Vetores
Embora Listas e Vetores sejam muito semelhantes, sendo estruturas sequências ordenadas, por debaixo do capô elas são bem diferentes. Então porquê o Clojure mantêm implementações/estruturas similares?
Tirei essa foto do meu celular em Viçosa no Ceará durante minhas férias em Agosto de 2022.
Vetores
Não são só os colchetes que diferenciam os vetores das listas. Por baixo, um Vetor é uma árvore persistente em que cada nó guarda até 32 itens. Isso permite acessar qualquer posição pelo índice em tempo quase constante e adicionar itens no fim sem copiar o vetor inteiro.
(def vector-numbers [1 2 3 4])
(conj vector-numbers 5)
;; => [1 2 3 4 5]
Listas
Listas, além de serem representadas através de parentes, por outro lado, são implementadas como listas ligadas em um sentido só: cada item aponta para o próximo. Por isso o conj adiciona no começo, que é o lugar mais barato.
(def list-numbers '(1 2 3 4))
(conj list-numbers 5)
;; => (5 1 2 3 4)
Conclusão
As duas abordagens apresentam pontos fortes bem diferentes. Em estruturas consideravelmente grandes, ir até uma determinada posição dentro de um Vetor pode ser considerado uma tarefa bastante rápida, isso pelo fato que o Clojure, internamente, usa um algoritmo para saber a localização. Já a Lista, irá precisar percorrer todos os elementos até chegar a determinada posição. Embora pareça que os vetores têm uma certa “vantagem”, as listas são bastante úteis, especialmente nas situações em que você deseja criar uma sequência anexando novos itens como demonstrado no exemplo anterior.
Referências
- Getting Clojure - Book