Oi Thiago,
Em Clojure nós temos sequências e coleções. Há uma forte relação entre as duas abstrações, mas a maior diferença é que as sequências estão relacionadas a elementos individuais enquanto as coleções a estrutura de dados como um todo. No caso das sequências, elas tem a habilidade de obter o primeiro elemento com a função first
e os outros elementos numa nova sequência com a função rest
.
Para ficar mais claro, veja que vetores são coleções com o auxílio da função coll?
> (coll? [1 2])
true
E com a função seq?
vemos que não são sequências
> (seq? [1 2])
false
Toda coleção suporta a função seq
, portanto toda função de sequência pode ser aplicada a uma coleção. Veja:
> (first [1 2])
1
Várias funções recebem uma coleção, aplicam seq
e trabalham na sua sequência. Um exemplo é o próprio doseq
da aula, mas existem vários outros.
De modo geral, você pode trabalhar com coleções e o Clojure as transformará em sequências se necessário. Não fique com a impressão de que são a mesma coisa. Por exemplo, a sequência das entradas de um mapa é diferente do mapa em si:
> (seq {:a 1 :b 2 :c 3})
([:a 1] [:c 3] [:b 2])
> (contains? {:a 1 :b 2 :c 3} :a)
true
> (contains? (seq {:a 1 :b 2 :c 3}) :a)
false
Existem detalhes mais técnicos e abstratos sobre o assunto, mas você não precisa explicitar a função seq
.