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 _ = eval [] bli (* 1 ou 4 *) let _ = eval [] 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) let _ = eval [] test_fmloc1 (* 51 *) let _ = eval [] test_fmloc2 (* 103 *) let _ = eval [] test_fmloc3 (* 102 *) let c = ["f", eval [] fmloc] let _ = eval c (TApp(TVar "f", TInt 50)) (* 51 *) let _ = eval c (TApp(TVar "f", TInt 50)) (* 52 !!! *) let _ = c (* regardez bien... *)