MTT
MTT

Reputation: 5263

How does this implementation of a stream work?

I'm totally new to Scheme, functional programming, and specifically streams. What are the first five integers in the following stream?

(define (mystery x y z)
  (cons x
        (lambda ()
          (mystery y z (+ x y z)))))

(mystery 1 2 3)

How does this work, and how can I use it in Racket?

Upvotes: 0

Views: 140

Answers (2)

Óscar López
Óscar López

Reputation: 236004

We can examine the contents of an infinite stream by implementing a procedure that consumes a given number of elements and returns them in a list, for example:

(define (print strm n)
  (if (zero? n)
      '()
      (cons (car strm)
            (print ((cdr strm)) (sub1 n)))))

If we apply it to your stream, here's what we obtain:

(print (mystery 1 2 3) 5)
=> '(1 2 3 6 11)

Although in this case, it'll be more useful if we try to understand what's happening under the hood. In the end, this is just a series of procedure invocations, if we take note of the parameters that get passed at each call it's easy to find the answer. Take a look at the first column in the following table, and remember that the stream is being built by consing all the x's:

 x  y  z
--------
 1  2  3
 2  3  6
 3  6 11
 6 11 20
11 20 37

Upvotes: 2

Jon Kiparsky
Jon Kiparsky

Reputation: 7743

This returns a list consisting of a number and a function. The function is - after the first call - the same as you'd get by calling (mystery 2 3 6) How does it work? cons just makes a list of its two arguments, which in this case are a value and the result of evaluating a lambda function, which is itself a function

Upvotes: 1

Related Questions