Sto cercando di capire l'esecuzione del seguente codice:Comprendere l'esecuzione di un'implementazione Fibonacci pigro in Clojure
(def fibs
(concat (lazy-seq [0 1]) (lazy-seq (map + fibs (rest fibs)))))
Questo è quello che mi aspetterei l'esecuzione a guardare come
[0 1 : (map + [0 1] [1]) => 1
[0 1 1 : (map + [0 1 1] [1 1]) => 1 2
[0 1 1 1 2 : (map + [0 1 1 2] [1 1 2]) => 1 2 3
[0 1 1 1 2 1 2 3 : (map + [0 1 1 2 3] [1 1 2 3]) => 1 2 3 5
[0 1 1 1 2 1 2 3 1 2 3 5 ....
Che è ovviamente errato, poiché il risultato è sbagliato. L'unica esecuzione ho potuto venire con quello prodotto il risultato corretto è questo:
[0 1 : (map + [0 1] [1]) => 1
[0 1 1 : (map + [1 1] [1]) => 2
[0 1 1 2 : (map + [1 2] [2]) => 3
[0 1 1 2 3 : (map + [2 3] [3]) => 5
[0 1 1 2 3 5 ....
E` una corretta "rappresentazione" dello stato della testa e della coda durante l'esecuzione? In tal caso, perché (rest fibs)
restituisce un singolo articolo? È a causa di una chiamata ricorsiva come (riposo (riposo (riposo [1 1 2 3])))?