46 lines
1.5 KiB
OCaml
46 lines
1.5 KiB
OCaml
(***********************************************************************)
|
|
(* *)
|
|
(* OCaml *)
|
|
(* *)
|
|
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
|
|
(* *)
|
|
(* Copyright 1996 Institut National de Recherche en Informatique et *)
|
|
(* en Automatique. All rights reserved. This file is distributed *)
|
|
(* under the terms of the Q Public License version 1.0. *)
|
|
(* *)
|
|
(***********************************************************************)
|
|
|
|
open Printf
|
|
open Thread
|
|
|
|
let rec integers n ch =
|
|
Event.sync (Event.send ch n);
|
|
integers (n+1) ch
|
|
|
|
let rec sieve n chin chout =
|
|
let m = Event.sync (Event.receive chin)
|
|
in if m mod n = 0
|
|
then sieve n chin chout
|
|
else Event.sync (Event.send chout m);
|
|
sieve n chin chout
|
|
|
|
let rec print_primes ch max =
|
|
let n = Event.sync (Event.receive ch)
|
|
in if n > max
|
|
then ()
|
|
else begin
|
|
printf "%d\n" n; flush stdout;
|
|
let ch_after_n = Event.new_channel ()
|
|
in Thread.create (sieve n ch) ch_after_n;
|
|
print_primes ch_after_n max
|
|
end
|
|
|
|
let go max =
|
|
let ch = Event.new_channel ()
|
|
in Thread.create (integers 2) ch;
|
|
print_primes ch max;;
|
|
|
|
let _ = go 1000
|
|
|
|
;;
|