Advertisement
Guest User

Untitled

a guest
Apr 30th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.44 KB | None | 0 0
  1. exception Skip
  2. exception Stop
  3.  
  4. let f = function 0 -> raise Stop | 13 -> raise Skip | x -> 2*x
  5.  
  6. let rec loop t n i =
  7.   if i >= n then ()
  8.   else try
  9.           t.(i) <- f (t.(i));
  10.           loop t n (i+1)
  11.        with Skip -> loop t n (i+2)
  12.  
  13. let res =
  14.  let t = [|1;13;0;4;0|] in
  15.  try loop t 5 0; t.(4) with Stop -> 22
  16.  
  17. (** En cps *)
  18.  
  19. let f_cps x k k' = match x with
  20.   | 0 -> k' Stop
  21.   | 13 -> k' Skip
  22.   | x -> k (2*x)
  23.  
  24. let rec loop_cps t n i k k' =
  25.   if i >= n then k ()
  26.   else f_cps
  27.          (t.(i))
  28.          (fun r -> t.(i) <- r; loop_cps t n (i+1) k k')
  29.          (function Skip -> loop_cps t n (i+2) k k'
  30.                  | e -> k' e)
  31.  
  32. let initcont r = r
  33.  
  34. let res_cps =
  35.   let t = [|1;13;0;4;0|] in
  36.   loop_cps t 5 0 (fun () -> initcont t.(4))
  37.                  (function Stop -> initcont 0
  38.                          | _ -> assert false)
  39.  
  40. (** Ici on peut facilement determiner que la ligne avec
  41.     assert false ne servira jamais. Sinon on peut mettre
  42.     à la place un traitement des exceptions "à toplevel",
  43.     p.ex. un affichage de "Uncaught exception" comme OCaml *)
  44.  
  45. (** NB : ce qui précède est de la CPS "à la OCaml" (avec
  46.     des fonctions anonymes accédant librement à toutes les
  47.     variables de la fonction englobante. Mais on peut transformer
  48.     ça en CPS "1er ordre" comme d'habitude :
  49.      - continuations comme fonctions externes auxiliaires
  50.      - environnements pour contenir les variables nécessaires
  51. *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement