Clojure Functional Programming & JVM Backend Development · Lezione

Sequenze lazy e stream infiniti

Padroneggi le sequenze lazy di Clojure per modellare stream infiniti, rimandare i calcoli ed elaborare i dati in modo efficiente senza esaurire la memoria.

Lezione 4 di 413 passaggi

Sequenze lazy e stream infiniti è una lezione Clojure Functional Programming & JVM Backend Development gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Clojure Functional Programming & JVM Backend Development, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Clojure Functional Programming & JVM Backend Development include 4 lezioni in totale.

Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.

What Is Laziness?

A lazy sequence computes its elements only as they are needed. This lets you describe potentially infinite data and consume just the part you want.

An Infinite Range

range with no arguments returns an infinite lazy sequence. It never materializes fully; you take only what you need.

(take 5 (range))
; => (0 1 2 3 4)

iterate

iterate builds an infinite sequence by repeatedly applying a function to a starting value.

(take 5 (iterate (fn [x] (* x 2)) 1))
; => (1 2 4 8 16)

repeat and cycle

repeat yields the same value forever; cycle loops a collection forever. Both are lazy.

(take 3 (repeat :x))   ; => (:x :x :x)
(take 5 (cycle [1 2])) ; => (1 2 1 2 1)

lazy-seq

You build your own lazy sequences with lazy-seq. The body runs only when the next element is requested.

(defn nums-from [n]
  (lazy-seq
    (cons n (nums-from (inc n)))))

(take 4 (nums-from 10)) ; => (10 11 12 13)

Lazy Transformations

map, filter, and take-while are all lazy. Chaining them does no work until you consume the result.

(->> (range)
     (map (fn [x] (* x x)))
     (filter even?)
     (take 4))
; => (0 4 16 36)

Realization & Chunking

Lazy seqs are realized in chunks of 32 for efficiency. So asking for one element may compute up to 32. Keep transformations side-effect-free to avoid surprises.

(first (map (fn [x] (println "seen" x) x) (range 100)))
; prints 0..31 due to chunking

Forcing Realization

Use doall to fully realize a lazy sequence (e.g. to trigger side effects), or dorun when you do not need the results.

(doall (map println [1 2 3]))

Avoiding the Head-Holding Trap

If you keep a reference to the head of an infinite seq while walking it, the whole realized portion stays in memory. Let go of the head to allow garbage collection.

; Bad: binding holds the head
(let [s (range)] (last (take 1000000 s)))

Practical Stream: Fibonacci

Lazy sequences elegantly express recursive streams like Fibonacci numbers.

(def fibs
  (map first
    (iterate (fn [[a b]] [b (+ a b)]) [0 1])))

(take 7 fibs) ; => (0 1 1 2 3 5 8)

Laziness vs Transducers

Lazy seqs build intermediate sequences; transducers (from a prior lesson) avoid them. Use laziness for infinite/streamed data and transducers for high-throughput pipelines.

Quick Check

Test your lazy-sequence intuition.

Recap

You learned how lazy sequences defer computation and model infinite streams.

  • Generate with range, iterate, repeat, cycle, lazy-seq
  • map/filter stay lazy until consumed
  • Beware chunking and head-holding
Gratis per iniziare

Impara Clojure con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
12
Lezioni
48

Domande Frequenti

La lezione «Sequenze lazy e stream infiniti» è gratuita?

Sì — il testo completo di «Sequenze lazy e stream infiniti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Clojure Functional Programming & JVM Backend Development, passa a CoddyKit PRO. Il corso Clojure Functional Programming & JVM Backend Development include 4 lezioni in totale.

Cosa imparerò in «Sequenze lazy e stream infiniti»?

Padroneggi le sequenze lazy di Clojure per modellare stream infiniti, rimandare i calcoli ed elaborare i dati in modo efficiente senza esaurire la memoria. Eserciti Clojure Functional Programming & JVM Backend Development con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Clojure Functional Programming & JVM Backend Development?

Non è richiesta alcuna esperienza precedente. Clojure Functional Programming & JVM Backend Development su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Sequenze lazy e stream infiniti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Clojure Functional Programming & JVM Backend Development?

Sì. Ogni lezione Clojure Functional Programming & JVM Backend Development include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Transducer per un’elaborazione efficiente
  2. Monad e astrazioni funzionali
  3. Property-based testing con clojure.test.check
  4. Sequenze lazy e stream infiniti
← Torna a Clojure Functional Programming & JVM Backend Development