Limboでエラトステネスのふるい
IPWLから。スレッドとチャネルを使った並行版エラトステネスのふるい。initのwhileループが無限整数列を作るジェネレータになっていて、各スレッドがふるいになっている。
implement Eratosthenes; include "sys.m"; include "draw.m"; sys : Sys; Eratosthenes : module { init : fn(nil : ref Draw->Context, nil : list of string); }; init(nil : ref Draw->Context, nil : list of string) { sys = load Sys Sys->PATH; i := 2; sourcechan := chan of int; spawn sieve(i, sourcechan); while () { sourcechan <-= i++; } } sieve(ourprime : int, inchan : chan of int) { n : int; sys->print("%d ", ourprime); newchan := chan of int; while (!((n = <- inchan) % ourprime)) { } spawn sieve(n, newchan); while () { if ((n = <- inchan) % ourprime) { newchan <-= n; } } }
おそらくErlangとかでもspawnとメールボックスを使って、同じプログラムを書けるのでは?Erlangのメッセージパッシングは非同期だけど。