type circular_list = Circular_list of (unit -> circular_list)
let rec c1 = (fun () -> Circular_list c1)
let forced_c1 = c1 ()
let Circular_list forced_c1_next = forced_c1
let _ = Printf.printf "%B\n" (forced_c1_next == c1)
let rec c2 = (fun () -> Circular_list (fun () -> Circular_list c2))
let forced_c2 = c2 ()
let Circular_list forced_c2_next = forced_c2
let Circular_list forced_c2_next_next = forced_c2_next ()
let _ = Printf.printf "%B\n" (forced_c2_next_next == c2)
let print_circular cl =
let halt = cl in
let rec aux n l =
let forced_l = l () in
let Circular_list forced_l_next = forced_l in
Printf.printf "%i" n;
if forced_l_next == halt then
Printf.printf "\n"
else(
Printf.printf ", ";
aux (n+1) forced_l_next
)
in
aux 0 cl
let print_circular2 cl =
let halt = cl in
let rec aux n l =
let Circular_list next = l in
Printf.printf "%i" n;
let forced_next = next () in
if forced_next == halt then
Printf.printf "\n"
else(
Printf.printf ", ";
aux (n+1) forced_next
)
in aux 0 halt
let build_circular n =
let rec aux dec l =
if dec = 0 then
l ()
else
Circular_list (fun () -> aux (dec-1) l)
in
let rec l = fun() -> aux n l in
l ()
let c3 = build_circular 3
let _ = Printf.printf "------\n";
print_circular c1;
Printf.printf "------\n";
print_circular c2;
Printf.printf "------\n";
print_circular2 c3 (* Stuck *)
This document was generated using caml2html