最後活躍 4 days ago

capitalex's Avatar capitalex 已修改 4 days ago. 還原成這個修訂版本

1 file changed, 14 insertions, 4 deletions

coroutines.ml

@@ -23,15 +23,25 @@ let resume co =
23 23
24 24 let yield () = perform Yield
25 25
26 - let task () =
26 + let task_a () =
27 + "X" |> print_endline |> yield ;
28 + "Y" |> print_endline |> yield ;
29 + "Z" |> print_endline
30 +
31 + let task_b () =
27 32 "A" |> print_endline |> yield ;
33 + let co = start task_a in
28 34 "B" |> print_endline |> yield ;
29 - "C" |> print_endline
35 + let co = resume co in
36 + "C" |> print_endline |> yield ;
37 + resume co |> ignore
30 38
31 39 let () =
32 40 1 |> print_int |> print_newline ;
33 - let co = start task in
41 + let co = start task_b in
34 42 2 |> print_int |> print_newline ;
35 43 let co = resume co in
36 44 3 |> print_int |> print_newline ;
37 - resume co |> ignore
45 + let co = resume co in
46 + 4 |> print_int |> print_newline ;
47 + resume co |> ignore

capitalex's Avatar capitalex 已修改 4 days ago. 還原成這個修訂版本

1 file changed, 37 insertions

coroutines.ml(檔案已創建)

@@ -0,0 +1,37 @@
1 + open Effect
2 + open Effect.Deep
3 +
4 + type _ Effect.t += Yield : unit t
5 +
6 + type status =
7 + | Complete
8 + | Suspended of (unit, status) continuation
9 +
10 + let start (f : unit -> unit) : status =
11 + match f () with
12 + | () ->
13 + Complete
14 + | effect Yield, cont ->
15 + Suspended cont
16 +
17 + let resume co =
18 + match co with
19 + | Complete ->
20 + Invalid_argument "Can't resume completed quotation" |> raise
21 + | Suspended k ->
22 + continue k ()
23 +
24 + let yield () = perform Yield
25 +
26 + let task () =
27 + "A" |> print_endline |> yield ;
28 + "B" |> print_endline |> yield ;
29 + "C" |> print_endline
30 +
31 + let () =
32 + 1 |> print_int |> print_newline ;
33 + let co = start task in
34 + 2 |> print_int |> print_newline ;
35 + let co = resume co in
36 + 3 |> print_int |> print_newline ;
37 + resume co |> ignore
上一頁 下一頁