class ['a] lst data = object val mutable data = (data : 'a) val mutable prev = ((Obj.magic ()) : 'a lst) val mutable next = ((Obj.magic ()) : 'a lst) method add new_data = new lst new_data in new_elem#set_next next; new_elem#set_prev (next#get_prev); next#set_prev new_elem; next <- new_elem method get_prev = prev method get_next = next method set_prev elem = prev <- elem method set_next elem = next <- elem method get = data end ;; let l = new lst (0, 0);; l#set_next l;; l#set_prev l;; let rec adder cnt = l#add (cnt, 0); if cnt > 0 then adder (cnt - 1) in adder 1000;; let rec iterator a cnt alst = if cnt = 0 then a else let (i, _) = alst#get in iterator (a + i) (cnt - 1) alst#get_next ;; let rec test cnt = ignore (iterator 0 1000 l); if cnt = 0 then () else test (cnt - 1) ;; test 1000000;;