signature PRIMES = sig val primes : int -> int list end; structure Primes :> PRIMES = struct (* val counter : int -> int CML.chan *) fun counter (n) = let val outCh = CML.channel () fun loop (n) = (CML.send (outCh, n); loop (n+1)) in CML.spawn (fn () => loop n); outCh end (* val filter : int * int CML.chan -> int CML.chan *) fun filter (p, inCh) = let val outCh = CML.channel () fun loop () = let val i = CML.recv inCh in if i mod p <> 0 then CML.send (outCh, i) else (); loop () end in CML.spawn (fn () => loop ()); outCh end (* val sieve : unit -> int CML.chan *) fun sieve () = let val primes = CML.channel () fun head ch = let val p = CML.recv ch in CML.send (primes, p); head (filter (p, ch)) end in CML.spawn (fn () => head (counter 2)); primes end (* val primes : int -> int list *) fun primes (n) = let val ch = sieve () fun loop (0, l) = List.rev l | loop (n, l) = loop (n-1, CML.recv(ch)::l) in loop (n, nil) end end; (* Compiler.Control.Print.printLength := 100; U.apply Primes.primes 100; *)