From 6f6ff0e39eb6d771ef5336394079646ccdc18bd5 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Tue, 7 Nov 2017 15:44:40 +0100 Subject: Use Zarith instead of Num for computing numbers --- evaluator.ml | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'evaluator.ml') diff --git a/evaluator.ml b/evaluator.ml index a5f3380..075f728 100755 --- a/evaluator.ml +++ b/evaluator.ml @@ -274,11 +274,10 @@ let () = begin (* Build a date *) register3 "date" (t_int, t_int, t_int) f_date ( fun year month day -> - Date.get_julian_day - (Num.int_of_num @@ Num.floor_num @@ D.Num.to_num year) - (Num.int_of_num @@ Num.floor_num @@ D.Num.to_num month) - (Num.int_of_num @@ Num.floor_num @@ D.Num.to_num day) - |> D.Num.of_num + D.Date.get_julian_day + (D.Num.to_int year) + (D.Num.to_int month) + (D.Num.to_int day) ); let module CompareNum = Make_Compare(D.Num) in @@ -286,6 +285,23 @@ let () = begin CompareNum.register t_int; register0 "rand" f_number D.Num.rnd; + register1 "exp" t_int f_number (fun x -> D.Num.of_float (exp @@ D.Num.to_float x)); + register0 "pi" f_number (fun () -> D.Num.of_float (4. *. atan 1.)); + register1 "sin" t_int f_number (fun x -> D.Num.of_float (sin @@ D.Num.to_float x)); + register1 "cos" t_int f_number (fun x -> D.Num.of_float (cos @@ D.Num.to_float x)); + register1 "tan" t_int f_number (fun x -> D.Num.of_float (tan @@ D.Num.to_float x)); + register1 "atan" t_int f_number (fun x -> D.Num.of_float (atan @@ D.Num.to_float x)); + register1 "asin" t_int f_number (fun x -> D.Num.of_float (asin @@ D.Num.to_float x)); + register1 "acos" t_int f_number (fun x -> D.Num.of_float (acos @@ D.Num.to_float x)); + register1 "sinh" t_int f_number (fun x -> D.Num.of_float (sinh @@ D.Num.to_float x)); + register1 "cosh" t_int f_number (fun x -> D.Num.of_float (cosh @@ D.Num.to_float x)); + register1 "tanh" t_int f_number (fun x -> D.Num.of_float (tanh @@ D.Num.to_float x)); + register2 "atan2" (t_int, t_int)f_number (fun x y -> + D.Num.of_float (atan2 (D.Num.to_float x) (D.Num.to_float y)) + ); + + register1 "sqrt" t_int f_number (fun x -> D.Num.of_float (sqrt @@ D.Num.to_float x)); + register3 "if" (t_bool, t_int, t_int) f_number if_; register3 "if" (t_bool, t_bool, t_bool) f_bool if_; register3 "if" (t_bool, t_string, t_string) f_string if_; @@ -298,8 +314,11 @@ let () = begin register0 "false" f_bool (fun () -> D.Bool.false_); register1 "not" t_bool f_bool D.Bool.not; register2 "and" (t_bool, t_bool) f_bool D.Bool.and_; +(* fold "and" t_bool f_bool D.Bool.and_ (D.Bool.true_); *) register2 "or" (t_bool, t_bool) f_bool D.Bool.or_; +(* fold "or" t_bool f_bool D.Bool.or_ (D.Bool.false_); *) register2 "xor" (t_bool, t_bool) f_bool D.Bool.neq; +(* fold "xor" t_bool f_bool D.Bool.neq (D.Bool.false_); *) let module CompareString = Make_Compare(D.String) in CompareString.register t_string; @@ -307,9 +326,11 @@ let () = begin reduce "min" t_int f_num D.Num.min; (* Minimum value from a list *) reduce "max" t_int f_num D.Num.max; (* Maximum value from a list *) - fold "sum" t_int f_number D.Num.add (D.Num.of_num (Num.num_of_int 0)); - fold "product" t_int f_number D.Num.mult (D.Num.of_num (Num.num_of_int 1)); + fold "sum" t_int f_number D.Num.add (D.Num.zero); + fold "product" t_int f_number D.Num.mult (D.Num.one); + register2 "gcd"(t_int, t_int) f_number D.Num.gcd; + register2 "lcm"(t_int, t_int) f_number D.Num.lcm; register1 "+" t_int f_num (fun x -> x); register1 "-" t_int f_num D.Num.neg; (* Unary negation *) register2 "^" (t_int, t_int) f_number D.Num.pow; -- cgit v1.2.3