Suggestion: New table iterators
Robert Virding
rv@REDACTED
Thu Oct 19 11:27:47 CEST 2000
Ulf Wiger <etxuwig@REDACTED> writes:
>
>Also, it would be nice to perform a list comprehension on an ets
>table.
>
>Using my hack of sys_pre_expand, it would have been easily
>accomplished by just adding a function
>
>ets:tab2lazy_list(Tab) ->
> K = ets:first(Tab),
> [Obj] = ets:lookup(Tab, K),
> [K|fun() -> next_in_tab(Tab, ets:next(Tab, K)) end].
>
>next_in_tab(Tab, '$end_of_table') -> [];
>next_in_tab(Tab, Key) ->
> [Obj] = ets:lookup(Tab, Key),
> [Obj | fun() -> next_in_tab(Tab, ets:next(Tab, K)) end].
>
>(ignoring the complication of bag tables for demo purposes.)
This is relatively easy to do in sys_pre_expand. On idea I had is to
use list comprehensions with special forms for generators, for example
R <- ets(foo)
R <- mnesia(foo)
which would extract elements from ets/mnesia tables. The implementation
would be very similar to what you have written and generate the table
elements one at a time and pass them into the lc. It would of course be
possible to mix tabel and list generators.
I prefer this way to generating lazy lists. But it is harder to pass
an accumulator along.
The problem with using lc is that you are explicitly building a list of
values, you are going Table -> List. This abuses the lc notion,
slightly.
I think the fold function is MUCH better as it can do all the LC can,
plus much more. The intent is also clearer.
Robert
--
Robert Virding Tel: +46 (0)8 545 55 017
Alteon Web Systems Email: rv@REDACTED
S:t Eriksgatan 44 WWW: http://www.bluetail.com/~rv
SE-112 34 Stockholm, SWEDEN
"Folk säger att jag inte bryr mig om någonting, men det skiter jag i".
More information about the erlang-questions
mailing list