Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/benchmarks/todo/cml-sieve/sieve.sml
ViewVC logotype

Annotation of /sml/trunk/benchmarks/todo/cml-sieve/sieve.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 193 - (view) (download)

1 : monnier 193 (* sieve.sml
2 :     *
3 :     * COPYRIGHT (c) 1990 by John H. Reppy. See COPYRIGHT file for details.
4 :     *
5 :     * A simple stream-style program to generate primes.
6 :     *)
7 :    
8 :     structure Main : BMARK =
9 :     struct
10 :     open CML
11 :    
12 :     fun counter ch = let
13 :     fun count i = (send(ch, i); count(i+1))
14 :     in
15 :     count 2
16 :     end
17 :    
18 :     fun filter (p, inCh, outCh) = let
19 :     fun loop () = let
20 :     val i = accept inCh
21 :     in
22 :     if ((i mod p) <> 0) then send (outCh, i) else ();
23 :     loop ()
24 :     end
25 :     in
26 :     spawn (loop)
27 :     end
28 :    
29 :     fun sieve () = let
30 :     val primes = channel ()
31 :     val ch = channel ()
32 :     fun loop ch = let
33 :     val p = accept ch
34 :     val ch' = channel ()
35 :     in
36 :     send (primes, p);
37 :     filter (p, ch, ch');
38 :     loop ch'
39 :     end
40 :     in
41 :     spawn (fn () => (counter ch));
42 :     spawn (fn () => (loop ch));
43 :     primes
44 :     end
45 :    
46 :     fun primes pr n = let
47 :     val ch = sieve()
48 :     fun loop 0 = ()
49 :     | loop i = (
50 :     pr (makestring(accept ch) ^ "\n");
51 :     loop(i-1))
52 :     in
53 :     loop n
54 :     end
55 :    
56 :     fun nthPrime n = let
57 :     val ch = sieve ()
58 :     fun loop 1 = (accept ch)
59 :     | loop i = (accept ch; loop(i-1))
60 :     in
61 :     loop n
62 :     end
63 :    
64 :     fun testit outstrm =
65 :     RunCML.doit((fn () => primes (outputc outstrm) 1000), SOME 40)
66 :     (*fun doit () = RunCML.doit(fn () => (nthPrime 1000; RunCML.shutdown()), SOME 40)*)
67 :     fun doit () = RunCML.doit(fn () => (nthPrime 1000; RunCML.shutdown()), NONE)
68 :    
69 :     end (* Main *)
70 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0