aboutsummaryrefslogtreecommitdiff
path: root/semestr-3/pf/lista3/procc.mli
blob: 64d834bf0cf6076f22e342f3d20f9d129a25f332 (plain)
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
55
(* Ten plik, razem z plikiem proc.ml implementują prostą bibliotekę do
   lekkich, kooperatywnych wątków. Aby używać tej biblioteki trzeba ją
   najpierw skompilować za pomocą poleceń:

   $ ocamlc -c proc.mli
   $ ocamlc -c proc.ml

   i ewentualnie, gdy ktoś chce z niej korzystać w programach kompilowanych
   do kodu maszynowego:

   $ ocamlopt -c proc.ml

   Aby załadować bibliotekę do interpretera, przekaż odpowiedni plik cmo
   jako argument interpretera w wierszu poleceń:

   $ utop proc.cmo

   Implementowane w niej funkcje są widoczne w module Proc:

   # Proc.run (Proc.send "ABC") ;;
   ABC
   - : unit = ()

   Można też moduł Proc otworzyć:

   # open Proc ;;
   # run (send "ABC") ;;
   ABC
   - : unit = ()
*)

(** Abstrakcyjny typ odpowiedzi *)
type ('z,'i,'o) ans

(** Obliczenie w CPS-ie wewnątrz pojedynczego procesu.
    Ma cztery parametry:
    'a - typ obliczenia (typ oczekiwany przez kontynuację)
    'z - typ zwracanej wartości przez cały proces
    'i - typ elementów strumienia wejściowego
    'o - typ elementów strumienia wyjściowego *)
type ('a,'z,'i,'o) proc = ('a -> ('z,'i,'o) ans) -> ('z,'i,'o) ans

(** Wysyłanie pojedynczej wartości do strumienia wyjściowego *)
val send : 'o -> (unit,'z,'i,'o) proc

(** Odebranie pojedynczej wartości ze strumienia wejściowego *)
val recv : ('i,'z,'i,'o) proc

(** Zastępuje bieżący proces dwoma nowymi połączonymi ze sobą *)
val (<|>>) : ('z,'z,'i,'m) proc -> ('z,'z,'m,'o) proc -> ('a,'z,'i,'o) proc

(** Uruchamia proces. Na wejściu znajdują się kolejne wiersze wejścia
    standardowego, natomiast wysyłane napisy są przekazywane na wyjście
    standardowe. *)
val run : ('a,'a,string,string) proc -> 'a