2013-11-26 15 views
5

Dies ist eine Frage im Zusammenhang mit der SICP Book Chapter 3.5.2.SICP Infinite Streams (Kapitel 3.5.2)

Ich implementiere eine Stream-Datenstruktur in anderen Programmiersprachen. Und ich bin mir nicht sicher, ob ich das folgende Snippet richtig verstehe.

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

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

Von dem, was ich bei (integers-starting-from (+ n 1)) verstanden wird, die Funktion auszuführen, die einen Wert zurückgeben von (cons-stream n (integers-starting-from (+ n 1)))) ausführt. Da der zweite Formalparameter des ist und weil er von () eingeschlossen ist, wird er die Funktion immer wieder unendlich ausführen, anstatt die Ausführung zu verzögern.

Aus dem, was ich vor der Ausführung dieses Snippets sehe, scheint es, dass die folgende ganze Zahl zu einem unendlichen rekursiven Element führt, bevor das zweite Element des Streams ausgeführt wird.

Warum scheint dies für das Schema zu funktionieren, das während der lecture gezeigt wird?

Aus meinem versteht es so etwas wie diese stattdessen geschrieben werden soll:

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

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

Ist dies bedeutet, dass Schema einige Arten von Magie hat, die die Ausführung von (integers-starting-from (+ n 1)) verzögern?

Vielen Dank im Voraus

+1

Für eine Implementierung eines etwas anderen Stils von Streams, siehe [SRFI-41] (http://srfi.schemers.org/srfi-41/), die auch verfügbar ist unter [mein Blog] (http://programmingpraxis.com/essays/#srfi41streams). Das Dokument beschreibt die Implementierung von 'cons-stream' im Detail. – user448810

Antwort

8

Der Trick liegt darin, wie wir cons-stream implementieren. Sie haben explizit ein Bewertungsversprechen erstellt, als Sie die (lambda() ...) Thunk definierten. Die spezielle Form cons-stream tut dies, aber implizit und unter Verwendung von Schemes Primitiven. Zum Beispiel kann es so umgesetzt werden, feststellen, wie wir delay verwenden:

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

Es macht mehr Sinn, all Versprechen zur Schaffung Logik in einem einzigen Ort zu verkapseln, sagen cons-stream, statt explizit Thunks überall zu schaffen.