[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: (stream-cons (1) stream-null) => stream
In other words, I think it is legitimate to define the stream abstraction
(stream-cons exp1 exp2) = (delay (cons exp1 exp2))
which is essentially how the current implementation does it, if I
remember correctly. Your alternative abstraction would correspond to
(stream-cons exp1 exp2) = (delay (cons (delay exp1) exp2)),
No, I don't believe the cons should be delayed. My abstraction is simply:
(cons (delay exp1) exp2)
Since exp2 is a stream, there really is no purpose in delaying the cons,
as far as I can tell[*]. Moreover it violates the spirit of "it is an
error if the second argument of stream-cons is not a stream"
specification since it delays the check of (stream? exp2) until either
the stream-car or stream-cdr are accessed, which may not even occur.
Such an implementation conforms only in the sense that "it is an error"
means "whatever". With the way streams are implemented currently, you
cannot ask stream-null? or stream-pair? of a stream without forcing the
components of a pair-- again violating the specification that "no
element of the stream is evaluated until it is accessed."
[*] You might want to delay the cons for things like referring to the
current stream, but this is precisely what stream-delay is used for in
the examples of the SRFI:
(let loop ((x 0))
(stream-cons x (loop (+ x 1))))))