let setcdr : 'a list -> 'a list -> unit = fun c v -> let c = Obj.repr c in assert(Obj.is_block c) ; Obj.set_field c 1 (Obj.repr v) ;; let lappend l1 l2 = let rec proc cell = function | [] -> setcdr cell l2 | x :: l -> let nxt = [ x ] in setcdr cell nxt ; proc nxt l in match l1 with | [] -> l2 | x :: l -> let head = [ x ] in proc head l ; head ;; let makelist c = let rec makelist_int c accum = if (c > 0) then makelist_int (c - 1) (lappend accum [ c ]) else (lappend accum [ c ]) in makelist_int c [] ;; let _ = makelist 5000;;