let p s n = print_string (s^string_of_int n^"\n"); flush stdout (*version 1*) let acc f init = let vR = ref init in let fApp x = let newX = f !vR x in vR := newX; newX in fApp let f1 = acc (+) 0 let _ = p "f1:" (f1 1) let _ = p "f1:" (f1 1) let _ = p "f1:" (f1 1) (*version 2*) let acc' f init = let vR = ref init in let fApp x = let newX = f !vR x in vR := newX; newX and fIni x = (vR := x) in (fApp,fIni) let (f1a,f1i) = acc' (+) 0 let _ = p "f1a:" (f1a 1) let _ = p "f1a:" (f1a 1) let _ = p "f1a:" (f1a 1) let _ = f1i (-5) let _ = p "f1a:" (f1a 1) let _ = p "f1a:" (f1a 1) let _ = p "f1a:" (f1a 1)