let m0 = Memory.empty let bli = (* let x=ref 0 in (x:=3; 1)+(!x) *) TLet("x",TRef(TInt 0), TAdd( TAffect(TVar "x",TInt 3,TInt 1), TDeref(TVar "x"))) let bla = (* let x=ref 0 in (!x)+(x:=3; 1) *) TLet("x",TRef(TInt 0), TAdd( TDeref(TVar "x"), TAffect(TVar "x",TInt 3,TInt 1))) let v,m = eval [] m0 bli (* 1 ou 4 *) let v,m = eval [] m0 bla (* 4 ou 1 *) let fmloc = (* let y=ref 0 in (fun x -> incr y; x+!y) *) TLet("y",TRef(TInt 0), TFun("x",TAffect(TVar "y", TAdd(TDeref(TVar "y"), TInt 1), TAdd(TVar "x", TDeref(TVar "y"))))) let test_fmloc1 = (* let f=fmloc in f 50 *) TLet("f",fmloc,TApp(TVar "f",TInt 50)) let test_fmloc2 = (* let f=fmloc in f 50 + f 50 *) TLet("f",fmloc, TAdd(TApp(TVar "f",TInt 50), TApp(TVar "f",TInt 50))) let test_fmloc3 = (* fmloc 50 + fmloc 50 *) TAdd(test_fmloc1,test_fmloc1) (* pour pouvoir bien observer la mémoire, ne "fermez" pas votre module Memory: 'module Memory = struct ... end' au lieu de 'module Memory: MEMORY = struct ... end' *) let v,m = eval [] m0 test_fmloc1 (* 51 *) let v,m = eval [] m0 test_fmloc2 (* 103 *) let v,m = eval [] m0 test_fmloc3 (* 102 *) let f,m = eval [] m0 fmloc let e = ["f",f] let x,m1 = eval e m (TApp(TVar "f", TInt 50)) (* 51 *) let x,m1 = eval e m (TApp(TVar "f", TInt 50)) (* 51 : on est vraiment fonctionnels... *) let x,m2 = eval e m1 (TApp(TVar "f", TInt 50)) (* 52... *)