Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | |
2 | structure Main = | |
3 | struct | |
4 | open CML | |
5 | ||
6 | val print = TextIO.print | |
7 | ||
8 | fun makeNatStream c = | |
9 | let | |
10 | val ch = channel () | |
11 | fun count i = (send(ch, i) | |
12 | ; count(i+1)) | |
13 | val _ = spawn (fn () => | |
14 | (print (concat ["makeNatStream: ", | |
15 | tidToString (getTid ()), | |
16 | "\n"]) | |
17 | ; count c)) | |
18 | in | |
19 | ch | |
20 | end | |
21 | ||
22 | fun makeFilter (p, inCh) = | |
23 | let | |
24 | val outCh = channel () | |
25 | fun loop () = | |
26 | let | |
27 | val i = sync (recvEvt inCh) | |
28 | in | |
29 | if ((i mod p) <> 0) | |
30 | then sync (sendEvt (outCh, i)) | |
31 | else () | |
32 | ; loop () | |
33 | end | |
34 | val _ = spawn loop | |
35 | in | |
36 | outCh | |
37 | end | |
38 | ||
39 | fun makePrimes () = | |
40 | let | |
41 | val primes = channel () | |
42 | fun head ch = | |
43 | let val p = recv ch | |
44 | in | |
45 | send(primes, p) | |
46 | ; head (makeFilter (p, ch)) | |
47 | end | |
48 | val _ = spawn (fn () => | |
49 | (print (concat ["makePrimes: ", | |
50 | tidToString (getTid ()), | |
51 | "\n"]) | |
52 | ; head (makeNatStream 2))) | |
53 | in | |
54 | primes | |
55 | end | |
56 | ||
57 | fun makeNatPrinter ch n = | |
58 | let | |
59 | fun loop i = | |
60 | if i > n then RunCML.shutdown OS.Process.success | |
61 | else let | |
62 | val m = recv ch | |
63 | val m' = Int.toString m | |
64 | fun loop' j = | |
65 | if j > m then () | |
66 | else (print (m' ^ "\n") | |
67 | ; loop' (j + 1)) | |
68 | in | |
69 | loop' m | |
70 | ; loop (i + 1) | |
71 | end | |
72 | val _ = spawn (fn () => | |
73 | (print (concat ["makeNatPrinter: ", | |
74 | tidToString (getTid ()), | |
75 | "\n"]) | |
76 | ; loop 0)) | |
77 | in | |
78 | () | |
79 | end | |
80 | ||
81 | fun doit' n = | |
82 | RunCML.doit | |
83 | (fn () => | |
84 | let | |
85 | val ch = makePrimes () | |
86 | val _ = makeNatPrinter ch n | |
87 | in | |
88 | () | |
89 | end, | |
90 | SOME (Time.fromMilliseconds 10)) | |
91 | ||
92 | fun doit n = | |
93 | let | |
94 | val x = doit' n | |
95 | in | |
96 | x | |
97 | end | |
98 | end |