struct: glob state fix: init func internal state with glob state, some tests

This commit is contained in:
ProgramSnail 2026-05-06 15:20:44 +00:00
parent 5833e5949c
commit bd809ed1cf
2 changed files with 60 additions and 36 deletions

View file

@ -78,12 +78,35 @@ struct
(* --- *) (* --- *)
type mem = value list * memid (* NOTE: memory and first free elem *) type mem = value list * memid (* NOTE: memory and first free elem *)
type types = (data * atype) list type types = (data * atype) list (* glob *) * (data * atype) list (* glob + loc *)
type vals = (data * memid) list type vals = (data * memid) list (* glob *) * (data * memid) list (* glob + loc *)
type state = mem * types * vals type state = mem * types * vals
(* --- *) (* --- *)
(* - state utils *)
let types_assoc (x : data) (types : types) : atype =
(* try ( List.assoc x (fst types) ) *)
(* with Not_found -> *)
List.assoc x (snd types)
let vals_assoc (x : data) (vals : vals) : memid =
(* try ( List.assoc x (fst vals) ) *)
(* with Not_found -> *)
List.assoc x (snd vals)
let types_glob_add (types : types) (x : data) (t : atype) =
((x, t) :: fst types, (x, t) :: snd types)
let types_add (types : types) (x : data) (t : atype) =
(fst types, (x, t) :: snd types)
let vals_glob_add (vals : vals) (x : data) (id : memid) =
((x, id) :: fst vals, (x, id) :: snd vals)
let vals_add (vals : vals) (x : data) (id : memid) =
(fst vals, (x, id) :: snd vals)
(* - utils *) (* - utils *)
let rec list_replace (xs : 'a list) (id : int) (y : 'a) : 'a list = match xs, id with let rec list_replace (xs : 'a list) (id : int) (y : 'a) : 'a list = match xs, id with
@ -131,7 +154,7 @@ struct
| AccessP (p, _) -> pathvar p | AccessP (p, _) -> pathvar p
let rec pathtype (types : types) (p : path) : atype = match p with let rec pathtype (types : types) (p : path) : atype = match p with
| VarP x -> List.assoc x types | VarP x -> types_assoc x types
| DerefP p -> (match pathtype types p with | DerefP p -> (match pathtype types p with
| RefT (_, t) -> t | RefT (_, t) -> t
| _ -> raise @@ Typing_error "pathtype: deref") | _ -> raise @@ Typing_error "pathtype: deref")
@ -145,7 +168,7 @@ struct
Printf.printf "mem size: %i, " (List.length (fst mem)); Printf.printf "mem size: %i, " (List.length (fst mem));
Printf.printf "mem size stored: %i " (snd mem); Printf.printf "mem size stored: %i " (snd mem);
Printf.printf "\n"; *) Printf.printf "\n"; *)
List.assoc x vals) vals_assoc x vals)
| DerefP p -> (match pathval mem vals p with | DerefP p -> (match pathval mem vals p with
| RefV id -> mem_get mem id | RefV id -> mem_get mem id
| _ -> raise @@ Typing_error "pathval: deref") | _ -> raise @@ Typing_error "pathval: deref")
@ -213,7 +236,7 @@ struct
let rec exprval (mem : mem) (vals : vals) (e : expr) : value = match e with let rec exprval (mem : mem) (vals : vals) (e : expr) : value = match e with
| UnitE -> ZeroV | UnitE -> ZeroV
| PathE p -> pathval mem vals p | PathE p -> pathval mem vals p
| RefE x -> RefV (List.assoc x vals) | RefE x -> RefV (vals_assoc x vals)
| TupleE es -> TupleV (List.map (exprval mem vals) es) | TupleE es -> TupleV (List.map (exprval mem vals) es)
(* - expression typing *) (* - expression typing *)
@ -221,7 +244,7 @@ struct
let rec exprtype (types : types) (e : expr) : atype = match e with let rec exprtype (types : types) (e : expr) : atype = match e with
| UnitE -> UnitT (Rd, NeverWr) | UnitE -> UnitT (Rd, NeverWr)
| PathE p -> pathtype types p | PathE p -> pathtype types p
| RefE x -> RefT (Rf, List.assoc x types) | RefE x -> RefT (Rf, types_assoc x types)
| TupleE es -> TupleT (List.map (exprtype types) es) | TupleE es -> TupleT (List.map (exprtype types) es)
(* - context initialization *) (* - context initialization *)
@ -234,12 +257,12 @@ struct
| VarD (t, e) -> let v = exprval mem vals e in | VarD (t, e) -> let v = exprval mem vals e in
let (mem', v') = valcopy mem v t in let (mem', v') = valcopy mem v t in
let (mem'', id) = mem_add mem' v' in let (mem'', id) = mem_add mem' v' in
(mem'', (x, t) :: types, (x, id) :: vals) (mem'', types_glob_add types x t, vals_glob_add vals x id)
| FunD (ts, s) -> let (mem', id) = mem_add mem (FunV [s]) in | FunD (ts, s) -> let (mem', id) = mem_add mem (FunV [s]) in
(mem', (x, FunT ts) :: types, (x, id) :: vals) (mem', types_glob_add types x (FunT ts), vals_glob_add vals x id)
let empty_mem : mem = ([], 0) let empty_mem : mem = ([], 0)
let empty_state : state = (empty_mem, [], []) let empty_state : state = (empty_mem, ([], []), ([], []))
(* TODO: better way ??? *) (* TODO: better way ??? *)
let globals_min_id : data = 1000 let globals_min_id : data = 1000
@ -300,7 +323,7 @@ struct
let argsspoilp (state : state) (m : mode) (t : atype) (p : path) : mem = let argsspoilp (state : state) (m : mode) (t : atype) (p : path) : mem =
match state with (mem, types, vals) -> match state with (mem, types, vals) ->
let x = pathvar p in let x = pathvar p in
let id = List.assoc x vals in let id = vals_assoc x vals in
let b = pathval mem vals p in let b = pathval mem vals p in
let t' = pathtype types p in let t' = pathtype types p in
let (mem', b') = valspoil mem b t t' m Rf in let (mem', b') = valspoil mem b t t' m Rf in
@ -326,7 +349,7 @@ struct
(* let t' = pathtype types p in *) (* let t' = pathtype types p in *)
let (mem', v') = valcopy mem v t in let (mem', v') = valcopy mem v t in
let (mem'', id) = mem_add mem' v' in let (mem'', id) = mem_add mem' v' in
(mem'', (x, t) :: types, (x, id) :: vals) (mem'', types_add types x t, vals_add vals x id)
(* - function evaluation *) (* - function evaluation *)
(* NOTE: not needed due to performed optimization in stmt_eval *) (* NOTE: not needed due to performed optimization in stmt_eval *)
@ -342,8 +365,8 @@ struct
pathval mem vals f in pathval mem vals f in
let t = (* FIXME TMP Printf.printf "call, before t\n"; *) let t = (* FIXME TMP Printf.printf "call, before t\n"; *)
pathtype types f in pathtype types f in
let types' : types = [] in let types' : types = (fst types, fst types) in
let vals' : vals = [] in let vals' : vals = (fst vals, fst vals) in
(match v, t with (match v, t with
| FunV (* xs, *) fstmts (* ) *), FunT ts -> | FunV (* xs, *) fstmts (* ) *), FunT ts ->
(* TODO: memoisation of the called functions *) (* TODO: memoisation of the called functions *)
@ -367,7 +390,7 @@ struct
if w == NeverWr if w == NeverWr
then raise @@ Eval_error "write: write tag" then raise @@ Eval_error "write: write tag"
else let x = pathvar p in else let x = pathvar p in
let id = List.assoc x vals in let id = vals_assoc x vals in
let (mem', v') = valupd mem (mem_get mem id) p ZeroV in let (mem', v') = valupd mem (mem_get mem id) p ZeroV in
(mem_set mem' id v', types, vals) (mem_set mem' id v', types, vals)
| _ -> raise @@ Eval_error "write: type") | _ -> raise @@ Eval_error "write: type")
@ -628,26 +651,26 @@ struct
with Eval_error msg -> Printf.printf "%s" msg; with Eval_error msg -> Printf.printf "%s" msg;
[%expect {| read |}] [%expect {| read |}]
(* let%expect_test "call inside call, dsl" = *) let%expect_test "call inside call, dsl" =
(* prog_eval_noret ( *) prog_eval_noret (
(* [ *) [
(* defgu uT_r_aw; *) defgu uT_r_aw;
(* defg (rfT uT_r_aw) rfg0E; *) defg (rfT uT_r_aw) rfg0E;
(* FunD ( *) FunD (
(* [moded @@ rfT @@ uT_aw], *) [moded @@ rfT @@ uT_aw],
(* wrS @@ drf @@ v0 *) wrS @@ drf @@ v0
(* ); *) );
(* FunD ( *) FunD (
(* [moded @@ cpT @@ uT_aw], *) [moded @@ cpT @@ uT_aw],
(* (callS vg2 [pE v0]) #. *) (callS vg2 [pE v0]) #.
(* (wrS @@ drf @@ v0) *) (wrS @@ drf @@ v0)
(* ) *) )
(* ], *) ],
(* (callS vg3 [pE vg1]) #. *) (callS vg3 [pE vg1]) #.
(* (rdS @@ drf @@ vg1) *) (rdS @@ drf @@ vg1)
(* ); *) );
(* Printf.printf "done!"; *) Printf.printf "done!";
(* [%expect {| done! |}] *) [%expect {| done! |}]
let%expect_test "simple call with global variable usage, dsl" = let%expect_test "simple call with global variable usage, dsl" =
prog_eval_noret ( prog_eval_noret (

View file

@ -979,8 +979,9 @@ $s in stmt, f in X, x in X, a in X$
rule( rule(
name: [ new reference copy value], name: [ new reference copy value],
$types_0 = []$, // TODO: FIXME: introduce global types and vals
$vals_0 = []$, $types_0 = types_#[glob]$,
$vals_0 = vals_#[glob]$,
// NOTE: dashed arrow to fill context // NOTE: dashed arrow to fill context
$cl types_0, vals_0, mu_0 cr $cl types_0, vals_0, mu_0 cr