Evaluation lazy

Clojure supporte les séquences lazy. D'ailleurs, un certain nombre de fonctions (comme map par exemple, présenté plus loin dans ce tutoriel) retournent des séquences lazy.

(defn numbers
  [n]
  (lazy-seq (cons (do (println n "!") n) (numbers (inc n)))))

La fonction récursive numbers prend un paramètre et retourne une séquence lazy contenant tous les entiers supérieurs ou égaux à n. La fonction appelle également println pour chaque entier.

La variable s contient le résultat de la fonction numbers. A ce moment, on voit que println n'a jamais été appelé. La séquence est créée, mais aucun calcul n'a été exécuté.

Rajoutez dans l'interpréteur (take s 4) pour obtenir les 4 premières valeurs de la séquence. Vous pouvez voir que println est appelé pour ces valeurs, la séquence s'est donc réalisée pour ces 4 valeurs.

Il est possible de forcer la réalisation d'une séquence lazy via la fonction dorun. Essayez par exemple (dorun 10 s) pour réaliser la séquence pour ses 10 premières valeurs. Si vous réalisez plusieurs fois le même appel à dorun, vous verrez que println n'est pas appelé. Ceci est normal, cette partie de la séquence lazy a déjà été réalisée.

Vous pouvez aussi forcer la réalisation de l'entièreté d'une séquence lazy via doall. Attention, sur une séquence infinie, cela peut vous causer des problèmes, la réalisation étant également infinie.

Précédent - Suivant -

(defn numbers
  [n]
  (lazy-seq (cons (do (println n "!") n) (numbers (inc n)))))

;; creates a lazy seq
(def s (numbers 10))


Powered by mcorbin - Available on Github