Não vamos esquecer que o trusty old into
permite que você pegue qualquer coisa seq
capaz (lista, vetor, mapa, conjunto, mapa classificado) e um recipiente vazio que você deseja preencher e coloque- into
o.
(into [] '(1 2 3 4)) ==> [1 2 3 4] "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4} "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2} "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"
into
é um invólucro conj
, que é a abstração base para inserir novas entradas apropriadamente em uma coleção com base no tipo da coleção. O princípio que faz com que esse fluxo tão bem é que Clojure é construir em abstrações componíveis , neste caso into
em cima conj
no topo da coleta e seq
.
Os exemplos acima ainda funcionariam bem se o destinatário estivesse sendo passado em tempo de execução: porque as abstrações subjacentes ( seq
e conj
) são implementadas para todas as coleções (e muitas das coleções de Java também), então as abstrações superiores não precisam se preocupar sobre muitos casos especiais relacionados a dados.