Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Função seq usada na aula 6

Na função doseq da aula 6, eu substitui o trecho

(seq palavra)

por apenas

palavra

sem os parênteses. E funcionou.

Testei um código semelhante, mas com uma lista de números e também funcionou.

Eu preciso mesmo usar a função seq? Qual seria a diferença?

Obrigado.

2 respostas
solução!

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.

Obrigado, Gabriel.