[plt-scheme] Re: plt-scheme Digest, Vol 7, Issue 31
Dan-
On Mar 15, 2006, at 10:55 AM, geb a wrote:
> The following code is taken from SICP's section on
> streams verbatim. While I realize there is an
> infinite recursion generating a stream of numbers,
> apparently the authors felt the code would work but
> drscheme seems to evaluate each infinite stream first.
> Does this have something to do with lazy evaluation
> (a term I know nothing about?). Is there some
> underlying reason for this that I don't know about or
> have I made some mistake with the code.
Which part is taken verbatim? I can see where STREAM-REF is given in
SICP (scrolling down from the link below), and it does match the
definition that you give.
[[ http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-24.html#%
25_sec_3.5.1 ]]
But where do you see their definitions for CONS-STREAM or DELAY?
My understanding is that you can't make CONS-STREAM or DELAY using
the DEFINE special form, the way you did below, because that will
define a call-by-value procedure (you say that you know nothing about
lazy evaluation, so I'll assume you don't know what I mean by call-by-
value). In essence, using DEFINE to define CONS-STREAM or DELAY
defeats their purpose.
If you read carefully, the text says that CONS-STREAM and DELAY are
both "special forms"; that means that they cannot be defined in the
same manner as procedures (for the same reason that you can't define
COND or AND using procedure definition). It carefully says that
"Cons-stream is a special form defined so that (cons-stream <a> <b>)
is equivalent to (cons <a> (delay <b>))"; but it does *not* give a
statement of the form "(define (cons-stream <a> <b>) ...)", because
there is not way to do that. [[ When they say X is equivalent to Y,
they mean that when you see X in the program text, you can replace it
with Y; but it does not mean that we have (define X Y) written down
somewhere. ]]
You could try something like:
(define-syntax cons-stream
(syntax-rules ()
((cons-stream <a> <b>)
(cons <a> (delay <b>)))))
to define the cons-stream special form. The delay special form
should already be built in; if it isn't, you should be able to use
DEFINE-SYNTAX in a similar manner to the above to get the effect you
want.
-Felix