2012-10-24 2 views
8

Kann jemand mir helfen, besser zu verstehen, wie man einen Strom schreibt?Streams in Racket

Ich verstehe, dass ein Stream eine unendliche Folge von Werten ist und die Art, wie ich gelernt habe, sie zu programmieren, ist ein Thunk, der, wenn er aufgerufen wird, ein Paar von (1) dem ersten Element in der Sequenz erzeugt und (2) ein Thunk, die den Strom für die zweite durch~~POS=TRUNC-infinity Elemente

zum Beispiel stellt:

(define powers-of-two 
    (letrec ([f (lambda (x) (cons x (lambda() (f (* x 2)))))]) 
     (lambda() (f 2)))) 

ich hier verstehen, dass es nur ist eine Zweierpotenz Herstellung und diese zum Beispiel des Zugriff auf (car (powers-of-two)) Aufruf zur Folge hätte in 2 und rufen (car ((cdr (powers-of-two)))) würde re sult in 4

Jetzt versuche ich, einen Strom red-blue die red und blue zwischen Streichern wechselt genannt zu schreiben, aber ich bin ein wenig verwirrt darüber, wie es in Schema

+0

so haben Sie es getan, congrats! Im Abschnitt "Schema" in http://c2.com/cgi/wiki?SieveOfEratosthenesInManyProgrammingLanguages ​​finden Sie ein Beispiel für SICP-formatierte Streams. Es gibt nur eine Makroregel, die Sie manuell anwenden können. –

Antwort

6

Für ein allgemeines Verständnis der Ströme zu konstruieren, ich d empfehle Abschnitt §3.5 Streams im SICP-Buch. Es wird Ihnen die grundlegenden Konzepte zur Lösung streambezogener Probleme beibringen, wie zum Beispiel den in der Frage.

In Bezug auf das Problem in der Frage, hier ist die allgemeine Idee, es zu lösen:

  • Körperbau zwei unendliche Ströme, man nur die Zeichenfolge "red" und die anderen "blue"
  • Kombinieren Sie beiden Ströme nehmen ein Element Herstellung von die eine und dann ein Element von dem anderen (alternierend), wird dieses Verfahren in interleave SICP
6

I, die Ströme schrieb SRFI-41 genannt beschreibt, prov Dies ist eine Implementierung und gibt viele Beispiele. Die Ströme dort unterscheiden sich von denen in SICP und sind "besser" in einer Weise, die in der SRFI erklärt wird.

14

Es sieht so aus, als ob Sie gefragt haben, wie Sie Ihre eigenen benutzerdefinierten Streams mit Thunks erstellen können, die andere bereits beantwortet haben. Nur für den Fall, es ist erwähnenswert, dass Racket eine Stream-Bibliothek eingebaut hat und die meisten Racketeers diese für Streams verwenden würden.

Hier ist ein Beispiel:

#lang racket 
(require racket/stream) 
(define reds (stream-cons "red" reds)) 
(define red-blues (stream-add-between reds "blue")) 

;; show ten of them 
(for ([i 10] [e (in-stream red-blues)]) 
    (displayln e)) 
1

Ich bin ein Neuling in diesem aber die folgenden Lösungen scheint gut zu funktionieren:

(define red-then-blue 
    (letrec ([f (lambda (x) (cons x(lambda()(f(cond [(string=? x "red") "blue"] 
               ["red"])))))]) 
    (lambda() (f "red"))))