2012-10-24 103 views
8

任何人都可以帮助我更好地了解如何写一个流?在球拍流

我知道流是一个无限的值序列,我学习编程它的方式是将它们表示为一个thunk,当被调用时产生一对(1)序列中的第一个元素和(2)

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

我明白这里是刚生产的两个大国,并访问这些例如调用(car (powers-of-two))会导致:表示为第二通无限元素

例如流一个thunk在2和调用(car ((cdr (powers-of-two))))将re SULT在4

现在我想写一个流称为red-blue的字符串redblue之间交替,但我有点困惑如何构建它

+0

所以你做到了,恭喜!查看http://c2.com/cgi/wiki?SieveOfEratosthenesInManyProgrammingLanguages中的Scheme部分,了解SICP风格流的实例。在那里只有一个宏规则,你可以在整个手动应用它。 –

回答

6

对于流的方案大致的了解,我d在SICP书中推荐第§3.5 Streams部分。它会教你解决流问题的基本概念,例如问题中的问题。

就问题的问题,这里的总体思路来解决这个问题:

  • 建造两座无限流,一个只生产了弦"red"和其他"blue"
  • 合并两个流采取一种元素一个和从另一个(交替)然后一个元件,此过程在SICP
  • 称为 interleave
6

我写SRFI-41其描述流,省ides一个实现,并给出了很多例子。那里的溪流与SICP中的溪流不同,并且在SRFI中解释的方式“更好”。

14

它看起来像你问如何建立自己的自定义流与thunk,其他人已经回答。以防万一,值得注意的是,Racket内置了一个流媒体库,大多数Racketeers会将其用于流媒体。

下面是一个例子:

#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

我在这一个新手,但下面的解决方案似乎工作,以及:

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