comprehensions Taylor Campbell (18 Jul 2003 15:34 UTC)
Re: comprehensions Phil Bewig (04 Aug 2003 13:47 UTC)

Re: comprehensions Phil Bewig 04 Aug 2003 13:47 UTC

On Friday, July 18, 2003 10:34 AM, Taylor Campbell [] wrote:
> Are there any plans to make STREAM-OF a little more consistent with SRFI 42? --
> while SRFI 42 is _Eager_ Comprehensions and STREAM-OF is a _lazy_ comprehension,
> and it is stated somewhere in the SRFI 42 document that the methods used were
> quite different, they do seem like they should have at least something in common
> -- e.g., have the same general form -- (stream-of outer inner expr) --, or have
> a similar sort of mechanism for defining new generators on STREAM-OF as
> in SRFI 42, or something?

I chose (stream-of expr outer inner) for its similarity to Haskell.  Dr Egner chose
(stream-of outer inner expr) because it makes the scope of variables flow from left
to right -- variables bound in outer are available in inner, and variables bound in both
outer and inner are available in expr.  I don't think either reason is particularly
compelling.  I do think the semantics of streams and SRFI 42 are sufficiently
different that it doesn't matter if their syntax is the same or not.  Does anyone
have any particularly strong feelings about the subject?

SRFI 42 required a mechanism for defining new generators as part of its basic
promise of efficient execution, which Egner was able to hide in a rather complex
set of macros.  Streams have no such need, since the closures, delays and
garbage collection implicit in streams will always have a fairly high run-time
cost; instead, the user can just write a function returning a stream, and use that
as a stream-of generator.  Thus, I do not anticipate adding a mechanism for
defining generators to stream-of as in SRFI 42.

The question that you didn't raise is whether the 'in' and 'is' keywords should be
prefix or infix.  I have been surprised that no one has raised this question.  I know
no reason to choose one or the other except for personal preference.  I do note
that Kent Dybvig, in section 9.3 of his book The Scheme Programming Language
('tspl2ed.html), makes them infix.  Dybvig also uses the
(set-of expr outer inner) syntax.  Haskell uses infix '<-' instead of 'in' but prefix
'let' instead of infix 'is'.

You might also be interested in the generic comprehensions provided by Eli
Barzilay's Swindle system (, which use a somewhat
different syntax for user-defined generators and a completely different underlying
implementation than Egner.  Barzilay's syntax is (list-of expr outer inner), with
extensions; he uses '<-' as an infix keyword in place of 'in', and also provides
infix 'is', as well as several other possibilities.