2024-10-25 21:29:49 +02:00
|
|
|
module Utility = Utility
|
|
|
|
|
open Types;;
|
|
|
|
|
|
|
|
|
|
Random.self_init ()
|
|
|
|
|
|
2024-10-26 01:47:30 +02:00
|
|
|
let (let*) = Result.bind
|
|
|
|
|
|
2024-10-25 21:29:49 +02:00
|
|
|
|
2024-11-06 17:21:14 +01:00
|
|
|
let rec principalTypings (D: ) (e: t_exp) : () result
|
|
|
|
|
|
|
|
|
|
let evaluate_type (_program: t_exp) (_context: typingshape) : (typingshape, error) result =
|
|
|
|
|
failwith "asd"
|
|
|
|
|
(* match program with *)
|
|
|
|
|
(* Integer _ -> Ok (VariableMap.empty, IntegerType) *)
|
|
|
|
|
(* | Boolean _ -> Ok (VariableMap.empty, BooleanType) *)
|
|
|
|
|
(* | Variable x -> ( *)
|
|
|
|
|
(* match (VariableMap.find_opt x (fst context)) with *)
|
|
|
|
|
(* (None) -> ( *)
|
|
|
|
|
(* let u = PolimorphicType (Utility.fromIntToString !globalIdentifier) in *)
|
|
|
|
|
(* globalIdentifier := !globalIdentifier + 1; *)
|
|
|
|
|
(* Ok (VariableMap.singleton x u, u) *)
|
|
|
|
|
(* ) *)
|
|
|
|
|
(* | (Some u) -> Ok (VariableMap.singleton x u, u) *)
|
|
|
|
|
(* ) *)
|
|
|
|
|
(* | Function (xs, typef, fbody) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | Application (f, xs) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | Plus (x, y) *)
|
|
|
|
|
(* | Minus (x, y) *)
|
|
|
|
|
(* | Times (x, y) *)
|
|
|
|
|
(* | Division (x, y) *)
|
|
|
|
|
(* | Modulo (x, y) *)
|
|
|
|
|
(* | Power (x, y) -> ( *)
|
|
|
|
|
(* let* partialResx = evaluate_type x context in *)
|
|
|
|
|
(* let* partialResy = evaluate_type y context in *)
|
|
|
|
|
(* match (partialResx, partialResy) with *)
|
|
|
|
|
(* ((conx, IntegerType), (cony, IntegerType)) -> *)
|
|
|
|
|
(* Ok (VariableMap.union (fun _ x _ -> Some x) conx cony, *)
|
|
|
|
|
(* FunctionType ([IntegerType; IntegerType], IntegerType)) *)
|
|
|
|
|
(* | ((conx, PolimorphicType xv), (cony, IntegerType)) -> *)
|
|
|
|
|
(* Ok (unify ) *)
|
|
|
|
|
(* | ((_conx, IntegerType), (_cony, PolimorphicType _yv)) *)
|
|
|
|
|
(* | ((_conx, PolimorphicType _xv), (_cony, PolimorphicType _yv)) -> failwith "ads" *)
|
|
|
|
|
(* | (_, _) -> Error (`WrongType "The arguments are of the wrong type") *)
|
|
|
|
|
(* ) *)
|
|
|
|
|
(* | PowerMod (x, y, z) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | Rand (x) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | BAnd (x, y) *)
|
|
|
|
|
(* | BOr (x, y) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | BNot (x) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | Cmp (x, y) *)
|
|
|
|
|
(* | CmpLess (x, y) *)
|
|
|
|
|
(* | CmpLessEq (x, y) *)
|
|
|
|
|
(* | CmpGreater (x, y) *)
|
|
|
|
|
(* | CmpGreaterEq (x, y) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | IfThenElse (guard, if_exp, else_exp) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | LetIn (x, xval, rest) -> failwith "Not Implemented" *)
|
|
|
|
|
(* | LetFun (f, xs, typef, fbody, rest) -> failwith "Not Implemented" *)
|
|
|
|
|
|
|
|
|
|
let typecheck (_program: t_exp) : (ftype, error) result =
|
|
|
|
|
failwith "Not Implemented"
|