2013-11-26 27 views
5

Questa è una domanda relativa allo SICP Book Chapter 3.5.2.SICP Infinite Stream (capitolo 3.5.2)

Sto implementando una struttura dati del flusso in altri linguaggi di programmazione. E non sono sicuro di aver compreso correttamente il seguente frammento.

(define (integers-starting-from n) 
    (cons-stream n (integers-starting-from (+ n 1)))) 

(define integers (integers-starting-from 1)) 

Da quanto capii (integers-starting-from (+ n 1)) eseguirà la funzione che restituisce un valore eseguendo (cons-stream n (integers-starting-from (+ n 1)))). Poiché il secondo parametro formale di cons-stream è (integers-starting-from (+ n 1)) e poiché è racchiuso tra (), eseguirà la funzione di nuovo e di nuovo all'infinito anziché ritardare l'esecuzione.

Da ciò che vedo prima di eseguire questo snippet, sembra che il seguente intero porterà a un ricorsivo infinito prima ancora dell'esecuzione dell'elemento secondi del flusso.

Perché questo sembra funzionare per lo schema come mostrato durante lo lecture?

Dal mio capire dovrebbe essere scritto qualcosa di simile a questo, invece:

(define (integers-starting-from n) 
    (cons-stream n (lambda() (integers-starting-from (+ n 1))))) 

(define integers (integers-starting-from 1)) 

Questo significa che schema ha alcuni tipi di magia che ritardano l'esecuzione di (integers-starting-from (+ n 1))?

Grazie in anticipo

+1

Per un'implementazione di uno stile di streaming un po 'diverso, consultare [SRFI-41] (http://srfi.schemers.org/srfi-41/), che è disponibile anche in [il mio blog] (http://programmingpraxis.com/essays/#srfi41streams). Il documento descrive in dettaglio l'implementazione di "cons-stream". – user448810

risposta

8

Il trucco sta nel modo in cui realizziamo cons-stream. Hai esplicitamente creato una promessa di valutazione quando hai definito il thunk (lambda() ...). Il modulo speciale cons-stream esegue questa operazione, ma in modo implicito e utilizzando le primitive di Scheme. Per esempio, può essere implementato in questo modo, si noti come le usiamo delay:

(define-syntax stream-cons 
    (syntax-rules() 
    ((stream-cons head tail) 
    (cons head (delay tail))))) 

Ha più senso per incapsulare tutta la logica promessa di creazione in un unico luogo, dire cons-stream, invece di creare in modo esplicito thunk ovunque.