2012-10-24 17 views
8

Qualcuno può aiutarmi a capire meglio come scrivere uno stream?stream in rack

Capisco che un flusso è una sequenza infinita di valori e il modo in cui ho imparato a programmarli è rappresentarli come un thunk che quando viene chiamato produce una coppia di (1) il primo elemento nella sequenza e (2) un tonfo che rappresenta il flusso per gli elementi di secondo attraverso-infinity

ad esempio:

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

capisco qui che si tratta solo di produrre una potenze di due e per accedere a questi, per esempio chiamando (car (powers-of-two)) risulterebbe in 2 e chiamando (car ((cdr (powers-of-two)))) sarebbe Sult in 4

Ora sto cercando di scrivere un flusso chiamato red-blue che si alterna tra le stringhe red e blue ma io sono un po 'confuso su come costruirlo

+0

così hai fatto, complimenti! Controlla la sezione Schema in http://c2.com/cgi/wiki?SieveOfEratosthenesInManyProgrammingLanguages ​​per un esempio funzionante di flussi in stile SICP. Esiste solo una regola macro, puoi applicarla manualmente in tutto. –

risposta

6

Per una comprensione generale dei flussi nello Schema, I' d raccomandare la sezione §3.5 Streams nel libro SICP. Ti insegnerà i concetti di base per risolvere problemi legati al flusso come quello nella domanda.

Per quanto riguarda il problema in questione, ecco l'idea generale per risolverlo:

  • costruire due flussi infiniti, uno che producono solo la stringa "red" e l'altro "blue"
  • combinare i due corsi d'acqua prendendo un elemento da uno e poi un elemento dall'altro (alternato), questa procedura è chiamata interleave in SICP
6

ho scritto SRFI-41 che descrive flussi, prov identifica un'implementazione e fornisce molti esempi. I flussi ci differiscono da quelli in SICP e sono "migliori" in un modo spiegato nella SRFI.

14

Sembra che stavi chiedendo come creare i tuoi flussi personalizzati con i thunk, che altri hanno già risposto. Nel caso, vale la pena notare che Racket ha una libreria di stream integrata e la maggior parte dei racket lo userebbe per i flussi.

Ecco un esempio:

#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

Sono un novizio in questo, ma le seguenti soluzioni sembra funzionare così:

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