[erlang-questions] generators/iterators

Joe Armstrong <>
Mon Jun 18 07:17:58 CEST 2007


You can easily make a lazy stream by creating a function
which returns the next value and a fun.

For example a generator for an infinite stream of integers might look like this

intsFrom(I) ->
    {I, fun() -> intsFrom(I+1) end}.

If you call intFrom(1) it will return {1, F1}
if you evaluate F1() it will return {2, F2}
if you evaluate F2()  is will return {3, F3} ... and so on

Or use a process

intsFrom(I) ->
       receive
            {Pid, next} ->
                  Pid ! I,
                  intsFrom(I+1)
       end.

Pid request the next integer by sending a {self(), next} message to
the generator



 /Joe



On 6/18/07, Damien Morton <> wrote:
> Umm, I just realised that a stream/generator would need to be a function
> that returns a function that can be called repeatedly to generate the
> sequence, probably terminating with a well-known sequence terminating
> exception.
>
> This would solve the problem of the generators needing to be reset
> during nested loops in a comprehension.
>
> > Hmm,
> >
> > Coming from a strong Python and C# background, I find myself missing
> > generators/iterators.
> >
> > For example, when using list comprehension syntax, I find myself wanting
> > to use a function as a generator
> >
> > items(X) ->
> >     fun() -> next_item(X) end.
> >
> > [Y*Y || Y <- items(X)]
> >
> > Would it be simple to have erlang recognise a function as a generator?
> >
> > Sorry if the terminology is getting mixed up here.
> > _______________________________________________
> > erlang-questions mailing list
> > 
> > http://www.erlang.org/mailman/listinfo/erlang-questions
> >
> >
> >
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>



More information about the erlang-questions mailing list