# 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