let p s n = print_string (s^string_of_int n^"\n"); flush stdout module type AccArgT = sig type t and t1 val init: t val f: t -> t1 -> t end module AccArgInt(I:sig val init:int val f:int->int->int end) = struct type t = int and t1 = int let init = I.init and f = I.f end (*version 1*) module Acc(T:AccArgT) = struct let vR = ref T.init let func = T.f let app x = let newX = func !vR x in vR := newX;newX end module F1 = Acc(AccArgInt(struct let init = 0 and f = (+) end)) let _ = p "f1:" (F1.app 1) let _ = p "f1:" (F1.app 1) let _ = p "f1:" (F1.app 1) (*version 2*) module Acc1(T:AccArgT) = struct module A = Acc(T) include A let init x = vR:=x end module F2 = Acc1(AccArgInt(struct let init = 0 and f = (+) end)) let _ = p "f2:" (F2.app 1) let _ = p "f2:" (F2.app 1) let _ = p "f2:" (F2.app 1) let _ = F2.init (-5) let _ = p "f2:" (F2.app 1) let _ = p "f2:" (F2.app 1) let _ = p "f2:" (F2.app 1)