[BONUS]

Secuencias

  • Qué es una secuencia
  • Funciones para secuencias
    • doseq
    • dotimes

Qué es una secuencia?

Estructuras de datos de Clojure

En Clojure, podemos decir que cada estructura de datos es una secuencia. Hasta ahora, aprendimos sobre vector y map, ambas de las cuales son secuencias. String también es una secuencia. Cuando algo es seq-uenciable, es una secuencia.

first para verificar secuencias

Si algo es seq-uenciable, aplicando first obtenemos el primer elemento de la secuencia. Ésta es una buena forma de probar si algo es o no es una secuencia.

Resultados de first

(turtle-names)
;=> [:trinity :neo :oracle :cypher] ; vector
(first (turtle-names))
;=> :trinity                        ; primer elemento

(:trinity (state))
;=> {:x 0, :y 0, :angle 90, :color [30 30 30]}  ; map
(first (:trinity (state)))
[:x 0]                                          ; primer elemento

(first "Hello, World!")  ; string
;=> \H                   ; primer elemento

(first :trinity)         ; la palabra clave no es seq-uenciable
;=> IllegalArgumentException Don't know how to create ISeq from:
clojure.lang.Keyword  clojure.lang.RT.seqFrom (RT.java:528)

Funciones para secuencias

Clojure es muy bueno para iterar sobre una secuencia. Hay muchas funciones que interactúan con secuencias. Por ejemplo, doseq, dotimes, for, loop, doall, o dorun.

Ya vimos las funciones map y reduce en la sección “Funciones cuyos parámetros son otras funciones”. Éstas también son funciones para secuencias.

doseq

La función doseq(“hacer una secuencia” - do a sequence) es una de las funciones frecuentemente utilizadas para secuencias, y funciona de manera similar a la función map. La función evalúa el cuerpo repetidamente, con cada elemento de la secuencia que se le pasa como argumento.

La función doseq recibe como argumento un vector de asociaciones de nombre-valor, que puede presentar un aspecto extraño: [nombre secuencia]. Al iterar sobre cada elemento de secuencia, el elemento iterado se asigna a nombre.

;; ejemplo de doseq
(doseq [n (turtle-names)] (forward n 40))

EJERCICIO 1

dotimes

La función dotimes(“hacer n veces”) es otra función de secuencias ampliamente utilizada. Como doseq, la función evalúa repetitivamente la forma pasada como cuerpo. La diferencia está en la asociación con el argumento. dotimes recibe: [nombre max-entero].

La función dotimes es lo más parecido a un bucle for en otros lenguajes de programación. Esta función nos permite acceder mediante un índice a cualquier elemento de la secuencia utilizando la función nth.

;; asumiendo que hay más de una tortuga
(def names (turtle-names))
(dotimes [n (count names)] (right (nth names n) (* 45 n)))

EJERCICIO 2

Regresar a la primera diapositiva, o ir al índice.