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