es10

f e' una funzione che, preso un numero, restituisce la
lista (infinita) di tutti i numeri interi a partire da questo.

nums e' la lista (infinita) di tutti i numeri naturali

In Haskell possiamo utilizzare oggetti infiniti come nums, grazie
alla "laziness" di Haskell, cioe' alla strategia di riduzione
che utilizza (in cui inoltre il valore di un'espressione
e' valutato solo se serve per la computazione).
In Haskell posso per esempio scrivere cose come

hd (tail nums)

il cui valore e' 1 (il secondo elemento della lista).

In Scheme una cosa simile non posso farla, poiche' lo Scheme
usa una strategia di riduzione call-by-value.
Non e' infatti neanche possibile definire

(define nums (f 0))

poiche' l'interprete Scheme dovrebbe associare a nums il valore di

(f 0)

Il valore di (f 0) e'

(cons n (f (+ n 1)))

La stategia call-by-value, prima di eseguire la cons valuta
i suoi argomenti e cosi' si finisce per entrare in una serie infinita
di chiamate ricorsive.
In Scheme pero' e' possibile definire

(define (f n)  (cons n (f (+ n 1))))

poiche' per Scheme una lambda espressione (e e quindi anche l'espressione
(lambda (n) (cons n (f (+ n 1))) )  e' un valore (in realta' e' la corrispondente
chiusura ad essere un valore, come sappiamo.
Pero' Scheme non riesce a valutare

(car (cdr (f 0)))

che e' praticamente il corrispondente di hd (tail nums).
Infatti prima di eseguire la car debbo valutare il suo argomento.
E prima di eseguire il cdr debbo valutare il suo argomento (f 0),
finendo cosi', come visto prima, in una infinita serie di chiamate ricorsive.



