[BONUS]

Sequências

  • O que são sequências
  • Funções para sequências
    • doseq
    • dotimes

O que são sequências?

Estruturas de dados do Clojure

Em Clojure podemos dizer que qualquer estrutura de dados é uma sequência. Até agora aprendemos vector e map, que são ambos sequências. String também é uma sequência. Quando algo é sequenciável, é uma sequência

first para o primeiro item, ou não

Se algo é sequenciável, a função first retorna o primeiro item da sequência. Isso é um bom teste pra saber se algo é ou não é uma sequência.

Resultados de first


(range 2 8)
;=> (2 3 4 5 6 7)

(first (range 2 8))
;=> 2

(first "Hello, World!")  ; string
;=> \H                   ; a primeira letra

(first :trinity)         ; keyword não é sequenciável
;=> IllegalArgumentException Don't know how to create ISeq from:
;=> clojure.lang.Keyword  clojure.lang.RT.seqFrom (RT.java:528)

Funções para sequências

Clojure é muito bom para iterar numa sequência. Existem várias funções que interagem com sequências. Por exemplo, doseq, dotimes, for, loop, doall, ou dorun.

Já vimos as funções map e reduce em “Funções que recebem outras funções”. Estas também são funções para sequências

doseq

O doseq (pra rodar uma sequência) é uma das funções bastante usadas para sequências, e funciona de forma bem similar à função map. Esta função repetidamente avalia o conteúdo passado para cada elemento da sequência.

A função doseq recebe bindings (atribuições) como argumentos. Os argumentos podem ser um vetor estranho: [nome-da-variavel sequencia]. Onde cada elemento da sequência é percorrido e atribuído a nome-da-variavel, um por um, a cada vez que o conteúdo do doseq é executado.

;; exemplo do doseq
(doseq [item items] (my-function item))

dotimes

O dotimes (para rodar um número de vezes) é outra função bastante usada pra sequências. Assim como doseq, a função repetidamente avalia o seu conteúdo. A diferença é a atribuição feita no argumento. dotimes recebe: [nome-da-variavel numero-inteiro-de-vezes].

A função dotimes é o que tem de mais parecido com os for-loops (laços for) de outras linguagens de programação. Essa função nos permite acessar uma sequência por índice em combinação com a função nth.

;; supondo que exitem várias tartarugas
(def nomes ["a" "b"])
(dotimes [n (count nomes)] (prn n))

Voltar para o primeiro slide, ou ir para o índice do currículo.