Traversing graphs
Tony Rogvall
tony@REDACTED
Wed May 25 20:09:38 CEST 2005
25 maj 2005 kl. 15.50 skrev Vlad Dumitrescu:
> Hi all,
>
> I just hit a problem where I clearly see how simple it would be
> with lazy evaluation. But since we don't have that, I wonder if
> anyone could point me to some non-lazy algorithms.
>
By working a bit, lazy evaluation can be done... (WARNING do not use
in real apps ;-)
For example using the macros:
-define(delay(X), fun() -> (X) end).
-define(force(X), force((X))).
force(F) when function(F) -> F();
force(V) -> V.
You can define a lazy algorithms (can of course only be used in this
context)
zeros() ->
[0 | ?delay(zeros())].
ones() ->
[1 | ?delay(ones())].
twos() ->
[2 | ?delay(ones())].
seq(Start) ->
[Start | ?delay(seq(Start+1))].
sieve1(L, P) ->
[N | T1] = ?force(L),
case N rem P of
0 -> sieve1(T1,P);
_ -> sieve([N | ?delay(sieve1(T1,P))])
end.
sieve(L) ->
[P | X] = ?force(L),
[P | ?delay(sieve1(X, P))].
primes() ->
sieve(seq(2)).
Regards
/Tony
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20050525/de582853/attachment.htm>
More information about the erlang-questions
mailing list