let rec a = a;;
let rec f x = if x = 0 then 0 else f x;;
f 0;;
f 1;;
List.hd (f 0 :: f 1 :: []);;
let rec from n = n :: from (n + 1);;
List.hd (from 0);;
type 'a llist = Nil | Cons of 'a * (unit -> 'a llist);;
let hd = function (Cons (x, _)) -> x | Nil -> failwith "hd";;
let tl = function (Cons (_, t)) -> t () | Nil -> failwith "tl";;
let rec from n = Cons (n, fun () -> from (n + 1));;
from 0;;
hd (from 0);;
tl (from 0);;
let rec to_list n xs = if n < 1 then [] else match xs with
Nil -> [] | Cons (x, t) -> x :: (to_list (n - 1) (t ()));;
to_list 3 (from 0);;
to_list 1000 (from 0);;
type 'a cell = Nil | Cons of 'a * 'a llist
and 'a llist = unit -> 'a cell;;
let rec tl xs = match xs () with Cons (_, t) -> t | Nil -> failwith "tl";;
let rec zipwith f xs ys = match (xs (), ys ()) with
(Cons (x, xs), Cons (y, ys)) -> fun () -> Cons (f x y, zipwith f xs ys)
| _ -> fun () -> Nil;;
let rec fibs = fun () -> Cons (0, fun () -> Cons (1, zipwith (+) fibs (tl fibs)));;
fibs ();;
(tl fibs) ();;
let rec fibs = fun () -> Cons (0, fun () -> Cons (1, fun () -> zipwith (+) fibs (tl fibs) ()));;
(tl fibs) ();;
(tl (tl fibs)) ();;
let rec zipwith f xs ys = match (xs (), ys ()) with
(Cons (x, xs), Cons (y, ys)) -> fun () -> Cons (f x y, fun () -> zipwith f xs ys ())
| _ -> fun () -> Nil;;
let rec fibs = fun () -> Cons (0, fun () -> Cons (1, fun () -> zipwith (+) fibs (tl fibs) ()));;
let rec to_list n xs = if n < 1 then [] else match xs () with Nil -> [] | Cons (x, t) -> x :: to_list (n - 1) t;;
to_list 10 fibs;;
to_list 20 fibs;;
to_list 32 fibs;;
open UnitList;;
to_list 20 fibs;;
to_list 32 fibs;;
let e = lazy (print_string "bla");;
Lazy.force e;;
open LazyList;;
to_list 30 fibs;;
to_list 60 fibs;;
primes;;
to_list 30 primes;;
to_list 1000 primes;;
List.rev (to_list 1000 primes);;
let x = ref 3;;
!x;;
x := 2;;
!x;;