Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type exp =
- | Ide of string (*Identificatore*)
- | Int of int (*Valori Interi*)
- | Bool of int (*Valori Booleani*)
- | Add of exp * exp (*Operatori Matematici*)
- | Sub of exp * exp
- | Mul of exp * exp
- | Eq of exp * exp
- | Leq of exp * exp
- | And of exp * exp (*Operatori Logici*)
- | Or of exp * exp
- | Not of exp
- | Fun of ide * exp (*Funzione con un parametro, non ricorsiva*)
- | IfThenElse of exp * exp * exp (*Classico If Then Else *)
- | LetIn of ide * exp * exp (*Blocco Let*)
- | Function of ide * exp (*Applicazione funzionale Ide(E)*)
- | CreateTuple of ide * exp (*Espressione Tupla*)
- | GetIndex of elts * integer (*Accesso Elemento Tupla*)
- | GetFirstN of exp * integer (* Seleziona elementi Tupla*)
- | TupleEquals of exp * exp (*Confronto tra tuple*)
- | Map of ide * exp (*Applica funzione ad elementi tupla*)
- and
- (*Elementi di una tupla*)
- elts =
- | Elemento of exp
- | Lista of exp list
- ;;
- (*Funzioni di supporto*)
- let rec getElement lista index = match lista with
- | [] -> raise OutOfBoundException
- | first::elems -> if index=0 then first else getElement elems index-1;;
- let rec eval (expression: exp) env funenv =
- match expression with
- | Int i -> i
- | Ide i -> env i
- | Bool i -> (match i with
- | 0 -> 0
- | 1 -> 1
- | _ -> raise TypeErrorException)
- | Add (e1, e2) -> (eval e1 env funenv) + (eval e2 env funenv)
- | Sub (e1, e2) -> (eval e1 env funenv) - (eval e2 env funenv)
- | Mul (e1, e2) -> (eval e1 env funenv) * (eval e2 env funenv)
- | Eq (e1, e2) -> if (eval e1 env funenv) = (eval e2 env funenv) then 1 else 0
- | Leq (e1, e2) -> if (eval e1 env funenv) <= (eval e2 env funenv) then 1 else 0
- | And (e1, e2) -> if eval e1 env funenv = 1 then eval e2 env funenv else 0
- | Or (e1, e2) -> if eval e1 env funenv = 1 then eval e2 env funenv else 0
- | Not (e1) -> if (eval e1 env funenv) = 1 then 0 else 1
- (*| Fun (funName, arg) -> (*Chiamata di funzione*)
- let value = eval arg env in
- let (param, body, ambiente) = fenv funName in
- let env1 = bind env param value in
- eval body env1 fenv *)
- | IfThenElse (e1, e2, e3) -> if eval e1 env funenv = 1 then eval e2 env funenv
- else eval e3 env funenv
- | LetIn (id, value, body) -> let value = eval value env funenv in
- let env1 = bind env id value in
- eval body env1 funenv
- | GetIndex (id, i) -> getElement (eval (*QUESTO --> *) id env funenv) (eval i env funenv)
- (*| GetFirstN (exp, i) -> (eval exp env funenv) fst (eval i env funenv) *)
- | TupleEquals (exp1, exp2) -> if (eval exp1 env funenv) = (eval exp2 env funenv) then 1 else 0
- (*| Map (funx, exp) -> map funx (eval exp env funenv) *)
- | _ -> raise WrongMatchException
- ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement