doseq

doseq permet d'itérer sur une séquence et d'exécuter pour chaque élément une action. Une fois l'itération terminée, doseq retourne nil.

(doseq [value [0 1 2 3 4]]
  (println value))

On remarque que doseq commence par une déclaration semblable à let. Ici, on indique que l'on va itérer sur un vector de 5 éléments, et que l'on utilisera println sur chaque valeur du vector (accessible via la variable value.

doesq retournant toujours nil, il est généralement utilisé pour provoquer des effets de bords (comme dans notre exemple avec l'utilisation de prinln).

doseq peut également être utilisé pour itérer sur plusieurs séquences, comme dans cet exemple:

(doseq [v1 [0 1 2 3 4]
        v2 [10 9 8 7 6]]
  (println v1 ":" v2))

Ici, on affichera toutes les combinaisons de v1 et v2 possibles.

Il est possible de faire un peu de magie avec doseq, via les keywords :let, :when et :while. Je ne présenterai ici que les deux premiers, :while étant assez complexe. Personnellement, je pense qu'il faut faire attention avec ces keywords qui peuvent parfois nuire à la lisibilité du code.

(doseq [v1 [0 1 2]
        v2 [10 9 8]
        :let [result (* v1 v2)]
        :when (> result 17)]
  (println result))

Ici, on déclare avec :let une variable result comme étant la multiplication de v1 et v2, et on utilise :when pour filtrer tous les résultats inférieurs à 17.

Détail intéressant, le destructuring fonctionne avec doseq.

Précédent - Suivant -

;; simple doseq
(doseq [value [0 1 2 3 4]]
  (println value))

(println "\n")

;; you can use multiple bindings
(doseq [v1 [0 1]
        v2 [10 9]]
  (println v1 ":" v2))

(println "\n")

;; using :when and :let
(doseq [v1 [0 1 2]
        v2 [10 9 8]
        :let [result (* v1 v2)]
        :when (> result 17)]
  (println result))

Powered by mcorbin - Available on Github