Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2015
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.49 KB | None | 0 0
  1. type PrimValue =
  2.     | BoolVal of bool
  3.     | IntVal of int
  4.  
  5. let inline operator val1 val2 op = op val1 val2
  6.  
  7. let rec eval (expr : expr) =
  8.     match expr with
  9.     | CstI i                   -> IntVal i
  10.     | Prim ("+", lOper, rOper) -> evalNumericExpr (+) lOper rOper
  11.     | Prim ("-", lOper, rOper) -> evalNumericExpr (-) lOper rOper
  12.     | Prim ("*", lOper, rOper) -> evalNumericExpr (*) lOper rOper
  13.     | Prim ("/", lOper, rOper) -> evalNumericExpr (/) lOper rOper
  14.     | Prim ("%", lOper, rOper) -> evalNumericExpr (%) lOper rOper
  15.     | CstB b                   -> BoolVal b
  16.     | Prim ("=", lOper, rOper)-> evalBoolExpr (=) lOper rOper
  17.     | Prim ("<>",lOper, rOper)-> evalBoolExpr (<>) lOper rOper
  18.     | Prim (">", lOper, rOper)-> evalBoolExpr (>) lOper rOper
  19.     | Prim ("<", lOper, rOper)-> evalBoolExpr (<) lOper rOper
  20.     | Prim (">=", lOper, rOper)-> evalBoolExpr (>=) lOper rOper
  21.     | Prim ("<=", lOper, rOper)-> evalBoolExpr (<=) lOper rOper
  22.     | _                 -> failwith "Syntax error"    
  23.  
  24. and evalNumericExpr op lOper rOper =
  25.     let left = eval lOper
  26.     let right = eval rOper
  27.     match (left, right) with
  28.     | (IntVal a, IntVal b) ->  IntVal (op a b)
  29.     | _                  -> failwith "Syntax error"
  30.  
  31. and evalBoolExpr op lOper rOper =
  32.     let left = eval lOper
  33.     let right = eval rOper
  34.     match (left, right) with
  35.     | (BoolVal a, BoolVal b) ->  BoolVal (op a b)
  36.     | (IntVal a, IntVal b)  -> BoolVal (op a b)
  37.     | _                  -> failwith "Syntax error"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement