[erlang-questions] eep-0012 (Extensions to comprehensions)

Andras Georgy Bekes <>
Wed Aug 6 17:19:55 CEST 2008


Hi,

I like the idea of extending comprehensions to tuples, twisting language 
constructs to being more generic is always a good idea (to think 
about :-)

What I miss is the ability to extend comprehensions by user defined 
generators, i.e. to be able to iterate over any data structure with a 
generator.

My propose is to introduce a fourth generator:
1, [<-] is for iterating over lists
2, {<-} is for iterating over tuples
3, <<<->> is for iterating over binaries
and
4, (<-) for iterating over anything else.

In the generator "X (<-) Expr", Expr should evaluate to a function that 
returns either an empty list or the next element and the continuation 
fun.

There are many possible types, just to mention a few:

----------------
Using tuples:

Generator = fun() -> Result
Result = [] | {term(),Generator}

----------------
List-like:

Generator = fun() -> Result
Result = [] | [term()|Generator]

----------------
QLC's TraverseFun type simplified:

Generator = fun() -> Objects
Objects = [] | [term() | ObjectList]
ObjectList =  Objects | TraverseFun

--------------------
And many others. (I prefer the last.)

The standard data types (arrays, sets, dicts, trees, etc) should provide 
their own iterator functions, and defining custom iterators is very 
easy.

Example:
--------------------
term_reader()->
    case io:read("Type any term or 'quit' >") of
	{ok,quit} -> [];
	{ok,Term} -> [Term|fun term_reader/0]
    end.
--------------------

Real nice would be if we'd extend not only generators, but the generated 
data as well. So we could, besides lists, tuples and binaries, generate 
any data structure by feeding the generated elements to a similar fun.
However, I can't find any good syntax for that.

How do you like the idea?

	Georgy

PS: I know, I know, QLC does the same and much more, but QLC is too 
heavyweight and you rarely use it because of that.



More information about the erlang-questions mailing list