[BONUS]
doseq
dotimes
En Clojure, podemos decir que cada estructura de datos es una secuencia. Hasta ahora, aprendimos sobre
vector
ymap
, 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.
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)
Clojure es muy bueno para iterar sobre una secuencia. Hay muchas funciones que interactúan con secuencias. Por ejemplo,
doseq
,dotimes
,for
,loop
,doall
, odorun
.Ya vimos las funciones
map
yreduce
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ónmap
. 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 desecuencia
, el elemento iterado se asigna anombre
.
;; ejemplo de doseq
(doseq [n (turtle-names)] (forward n 40))
chord
y más adelantedotimes
La función
dotimes
(“hacer n veces”) es otra función de secuencias ampliamente utilizada. Comodoseq
, 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 buclefor
en otros lenguajes de programación. Esta función nos permite acceder mediante un índice a cualquier elemento de la secuencia utilizando la funciónnth
.
;; asumiendo que hay más de una tortuga
(def names (turtle-names))
(dotimes [n (count names)] (right (nth names n) (* 45 n)))
Regresar a la primera diapositiva, o ir al índice.