Advertisement
alessandro308

Untitled

Aug 23rd, 2015
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.65 KB | None | 0 0
  1. type exp =
  2.     | Ide of string (*Identificatore*)
  3.     | Int of int (*Valori Interi*)
  4.     | Bool of int (*Valori Booleani*)
  5.     | Add of exp * exp (*Operatori Matematici*)
  6.     | Sub of exp * exp
  7.     | Mul of exp * exp
  8.     | Eq of exp * exp
  9.     | Leq of exp * exp
  10.     | And of exp * exp (*Operatori Logici*)
  11.     | Or of exp * exp
  12.     | Not of exp
  13.     | Fun of ide * exp (*Funzione con un parametro, non ricorsiva*)
  14.     | IfThenElse of exp * exp * exp (*Classico If Then Else *)
  15.     | LetIn of ide * exp * exp (*Blocco Let*)
  16.     | Function of ide * exp (*Applicazione funzionale Ide(E)*)
  17.     | CreateTuple of ide * exp (*Espressione Tupla*)
  18.     | GetIndex of elts * integer (*Accesso Elemento Tupla*)
  19.     | GetFirstN of exp * integer (* Seleziona elementi Tupla*)
  20.     | TupleEquals of exp * exp (*Confronto tra tuple*)
  21.     | Map of ide * exp (*Applica funzione ad elementi tupla*)
  22. and
  23. (*Elementi di una tupla*)
  24.  elts =
  25.     | Elemento of exp
  26.     | Lista of exp list
  27. ;;
  28.  
  29.     (*Funzioni di supporto*)
  30. let rec getElement lista index = match lista with
  31.     | [] -> raise OutOfBoundException
  32.     | first::elems -> if index=0 then first else getElement elems index-1;;
  33.  
  34. let rec eval (expression: exp) env funenv =
  35.     match expression with
  36.     | Int i -> i
  37.     | Ide i -> env i
  38.     | Bool i -> (match i with
  39.                 | 0 -> 0
  40.                 | 1 -> 1
  41.                 | _ -> raise TypeErrorException)
  42.     | Add (e1, e2) -> (eval e1 env funenv) + (eval e2 env funenv)
  43.     | Sub (e1, e2) -> (eval e1 env funenv) - (eval e2 env funenv)
  44.     | Mul (e1, e2) -> (eval e1 env funenv) * (eval e2 env funenv)
  45.     | Eq (e1, e2) -> if (eval e1 env funenv) = (eval e2 env funenv) then 1 else 0
  46.     | Leq (e1, e2) -> if (eval e1 env funenv) <= (eval e2 env funenv) then 1 else 0
  47.     | And (e1, e2) -> if eval e1 env funenv = 1 then eval e2 env funenv else 0
  48.     | Or (e1, e2) -> if eval e1 env funenv = 1 then eval e2 env funenv else 0
  49.     | Not (e1) -> if (eval e1 env funenv) = 1 then 0 else 1
  50.     (*| Fun (funName, arg) -> (*Chiamata di funzione*)
  51.         let value = eval arg env in
  52.                 let (param, body, ambiente) = fenv funName in
  53.                         let env1 = bind env param value in
  54.                         eval body env1 fenv *)
  55.     | IfThenElse (e1, e2, e3) -> if eval e1 env funenv = 1 then eval e2 env funenv
  56.                                                     else eval e3 env funenv
  57.     | LetIn (id, value, body) -> let value = eval value env funenv in
  58.                                     let env1 = bind env id value in
  59.                                         eval body env1 funenv
  60.     | GetIndex (id, i) -> getElement (eval (*QUESTO --> *) id env funenv) (eval i env funenv)
  61.     (*| GetFirstN (exp, i) -> (eval exp env funenv) fst (eval i env funenv) *)
  62.     | TupleEquals (exp1, exp2) -> if (eval exp1 env funenv) = (eval exp2 env funenv) then 1 else 0
  63.     (*| Map (funx, exp) -> map funx (eval exp env funenv) *)
  64.     | _ -> raise WrongMatchException
  65. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement