2012-10-24 9 views
8

Czy ktoś może mi pomóc lepiej zrozumieć, jak napisać strumień?strumienie w rakietach

Rozumiem, że strumień jest nieskończoną sekwencją wartości i sposób, w jaki nauczyłem się ich programować, reprezentuje je jako thunk, który po wywołaniu tworzy parę (1) pierwszego elementu w sekwencji i (2) thunk, który reprezentuje strumień dla elementów używanych przez nieskończoności

na przykład:

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

rozumiem tu, że jest on po prostu wytwarzania potęgami dwójki, a dostęp do nich na przykład dzwoniąc (car (powers-of-two)) spowodowałoby w 2 i wywołanie (car ((cdr (powers-of-two)))) byłaby ponownie DOPROWADZIĆ 4

Teraz próbuję napisać strumień zwany red-blue który zmienia się pomiędzy strunami red i blue ale jestem trochę mylić o tym, jak zbudować go

+0

tak zrobiłeś to, gratulacje! Zapoznaj się z sekcją Scheme w http://c2.com/cgi/wiki?SieveOfEratosthenesInManyProgrammingLanguages, aby zobaczyć działający przykład strumieni w stylu SICP. Jest tam tylko jedna reguła makro, możesz ją stosować ręcznie przez cały czas. –

Odpowiedz

6

Dla ogólnego zrozumienia strumieni na schemacie I” d. polecić rozdział §3.5 Streams w książce SICP. Nauczy Cię podstawowych koncepcji rozwiązywania problemów związanych ze strumieniem, takich jak ten w pytaniu.

Odnośnie problemu w kwestii, oto ogólny pomysł, aby go rozwiązać:

  • zbudować dwa nieskończone strumienie, jeden produkujące tylko ciąg "red" a drugi "blue"
  • połączyć oba strumienie biorąc jeden element z jeden czym jeden element z drugiej strony (na przemian), procedura ta jest nazywana interleave w SICP
6

pisałem SRFI-41 opisującą strumienie, Prov ides realizacji i daje wiele przykładów. Strumienie tam różnią się od tych w SICP i są "lepsze" w sposób wyjaśniony w SRFI.

14

Wygląda na to, że pytasz, jak tworzyć własne strumienie niestandardowe za pomocą odłamków, na które inni już odpowiedzieli. Na wszelki wypadek warto zauważyć, że Racket ma wbudowaną bibliotekę strumieniową i większość Racketeersów użyłaby go do strumieni.

Oto przykład:

#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

jestem nowicjuszem w tym, ale następujące rozwiązania wydaje się działać także:

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