File: testsieve.ml

package info (click to toggle)
ocaml 4.02.3-9
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 22,076 kB
  • ctags: 30,429
  • sloc: ml: 154,213; ansic: 38,324; sh: 5,236; makefile: 4,569; asm: 4,283; lisp: 4,224; awk: 88; perl: 87; fortran: 21; cs: 9; sed: 9
file content (54 lines) | stat: -rw-r--r-- 2,025 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(***********************************************************************)
(*                                                                     *)
(*                                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.               *)
(*                                                                     *)
(***********************************************************************)

let sieve primes=
  Event.sync (Event.send primes 0);
  Event.sync (Event.send primes 1);
  Event.sync (Event.send primes 2);
  let integers = Event.new_channel () in
  let rec enumerate n=
    Event.sync (Event.send integers n);
    enumerate (n + 2)
  and filter inpout =
    let n = Event.sync (Event.receive inpout)
    (* On prepare le terrain pour l'appel recursif *)
    and output = Event.new_channel () in
    (* Celui qui etait en tete du crible est premier *)
    Event.sync (Event.send primes n);
    Thread.create filter output;
    (* On elimine de la sortie ceux qui sont des multiples de n *)
    while true do
        let m = Event.sync (Event.receive inpout) in
        (* print_int n; print_string ": "; print_int m; print_newline(); *)
        if (m mod n) = 0
        then ()
        else ((Event.sync (Event.send output m));())
      done in
  Thread.create filter integers;
  Thread.create enumerate 3

let premiers = Event.new_channel ()

let main _ =
  Thread.create sieve premiers;
  while true do
    for i = 1 to 30 do
      let n = Event.sync (Event.receive premiers) in
      print_int n; print_newline()
    done;
    exit 0
    done


let _ =
  try main ()
  with _ -> exit 0;;