Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

streams in racket

Tags:

scheme

racket

Can anyone help me better understand how to write a stream?

I understand that a stream is an infinite sequence of values and the way I have learned programming them is a representing them as a thunk that when called produces a pair of (1) the first element in the sequence and (2) a thunk that represents the stream for the second-through-infinity elements

For example:

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

I understand here that it is just producing a powers of two and to access these for example calling (car (powers-of-two)) would result in 2 and calling (car ((cdr (powers-of-two)))) would result in 4

Now I am trying to write a stream called red-blue that alternates between strings red and blue but I am a little confused about how to construct it

like image 447
kfem Avatar asked Oct 24 '12 04:10

kfem


People also ask

What is a stream in racket?

A stream is a kind of sequence that supports functional iteration via stream-first and stream-rest. The stream-cons form constructs a lazy stream, but plain lists can be used as streams, and functions such as in-range and in-naturals also create streams. (require racket/stream)

Are streams in racket Memoized?

The expressions passed to stream-cons are not evaluated until requested either with stream-first or stream-rest . Once evaluated, they are memoized.


2 Answers

It looks like you were asking how to build your own custom streams with thunks, which others have already answered. Just in case, it's worth noting that Racket has a stream library built-in and most Racketeers would use that for streams.

Here's an example:

#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))
like image 134
Asumu Takikawa Avatar answered Nov 15 '22 08:11

Asumu Takikawa


For a general understanding of streams in Scheme, I'd recommend section §3.5 Streams in the SICP book. It'll teach you the basic concepts to solve stream-related problems such as the one in the question.

Regarding the problem in the question, here's the general idea to solve it:

  • Build two infinite streams, one producing only the string "red" and the other "blue"
  • Combine both streams taking one element from one and then one element from the other (alternating), this procedure is called interleave in SICP
like image 26
Óscar López Avatar answered Nov 15 '22 08:11

Óscar López