From cd277b6915bdbf4c82bc3c69725ca9417eca4cf1 Mon Sep 17 00:00:00 2001
From: Alan Schmitt <alan.schmitt@polytechnique.org>
Date: Tue, 3 May 2016 12:06:51 +0200
Subject: [PATCH] let%number

---
 generator/monad_ppx.ml                 |  1 +
 generator/tests/jsref/JsInterpreter.ml | 43 +++++++++++++-------------
 2 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/generator/monad_ppx.ml b/generator/monad_ppx.ml
index 42ea9ff..b17b5de 100644
--- a/generator/monad_ppx.ml
+++ b/generator/monad_ppx.ml
@@ -11,6 +11,7 @@ let monad_mapping =
     ("object", "if_object");
     ("value", "if_value");
     ("prim", "if_prim");
+    ("number", "if_number");
     (*("success", "ifsuccess")*)
    ]
 
diff --git a/generator/tests/jsref/JsInterpreter.ml b/generator/tests/jsref/JsInterpreter.ml
index ebf47ba..06ee445 100644
--- a/generator/tests/jsref/JsInterpreter.ml
+++ b/generator/tests/jsref/JsInterpreter.ml
@@ -477,22 +477,22 @@ and to_number s c _foo_ = match _foo_ with
     state -> execution_ctx -> value -> result **)
 
 and to_integer s c v =
-  if_number (to_number s c v) (fun s1 n ->
+  let%number (s1, n) = to_number s c v in
       res_ter s1
         (res_val (Coq_value_prim (Coq_prim_number
-                                    (convert_number_to_integer n)))))
+                                    (convert_number_to_integer n))))
 
 (** val to_int32 :
     state -> execution_ctx -> value -> float specres **)
 
 and to_int32 s c v =
-  if_number (to_number s c v) (fun s_2 n -> res_spec s_2 (JsNumber.to_int32 n))
+  let%number (s_2, n) = to_number s c v in res_spec s_2 (JsNumber.to_int32 n)
 
 (** val to_uint32 :
     state -> execution_ctx -> value -> float specres **)
 
 and to_uint32 s c v =
-  if_number (to_number s c v) (fun s_2 n -> res_spec s_2 (JsNumber.to_uint32 n))
+  let%number (s_2, n) = to_number s c v in res_spec s_2 (JsNumber.to_uint32 n)
 
 (** val to_string :
     state -> execution_ctx -> value -> result **)
@@ -726,8 +726,7 @@ and object_define_own_prop s c l x desc throwcont =
                                                | Some descValue ->
                                                  let%run 
                                                    (s1, newLen) = (to_uint32 s0 c descValue) in 
-                                                      if_number (to_number s1 c descValue)
-                                                        (fun s2 newLenN ->
+                                                      let%number (s2, newLenN) = to_number s1 c descValue in
                                                            if not_decidable
                                                                (number_comparable (of_int newLen)
                                                                   newLenN)
@@ -785,7 +784,7 @@ and object_define_own_prop s c l x desc throwcont =
                                                                                        newLenDesc0
                                                                                        newWritable
                                                                                        throwcont
-                                                                                       def)))))
+                                                                                       def))))
                                                | None ->
                                                  def s0
                                                    ("length")
@@ -1679,8 +1678,8 @@ and run_construct_prealloc s c b args =
          if list_eq_nil_decidable args
          then follow s (Coq_value_prim (Coq_prim_number JsNumber.zero))
          else let_binding (get_arg 0 args) (fun v ->
-             if_number (to_number s c v) (fun x x0 ->
-                 follow x (Coq_value_prim (Coq_prim_number x0)))))
+             let%number (x, x0) = (to_number s c v) in
+                 follow x (Coq_value_prim (Coq_prim_number x0))))
   | Coq_prealloc_array ->
     let_binding
       (object_new (Coq_value_object (Coq_object_loc_prealloc
@@ -2934,7 +2933,7 @@ and run_unary_op s c op e =
   if prepost_unary_op_dec op
   then if_success (run_expr s c e) (fun s1 rv1 ->
       let%run  (s2, v2) = (ref_get_value s1 c rv1) in 
-          if_number (to_number s2 c v2) (fun s3 n1 ->
+          let%number  (s3, n1) = (to_number s2 c v2) in 
               if_some (run_prepost_op op) (fun po ->
                   let (number_op, is_pre) = po in
                   let_binding (number_op n1) (fun n2 ->
@@ -2944,7 +2943,7 @@ and run_unary_op s c op e =
                              (ref_put_value s3 c rv1 (Coq_value_prim
                                                         (Coq_prim_number n2))) (fun s4 ->
                                  result_out (Coq_out_ter (s4,
-                                                          (res_val (Coq_value_prim v))))))))))
+                                                          (res_val (Coq_value_prim v)))))))))
   else (match op with
       | Coq_unary_op_delete ->
         if_success (run_expr s c e) (fun s0 rv ->
@@ -2996,10 +2995,10 @@ and run_unary_op s c op e =
               res_ter s1 (res_val (Coq_value_prim Coq_prim_undef))
             | Coq_unary_op_add -> to_number s1 c v
             | Coq_unary_op_neg ->
-              if_number (to_number s1 c v) (fun s2 n ->
+              let%number  (s2, n) = (to_number s1 c v) in 
                   res_ter s2
                     (res_val (Coq_value_prim (Coq_prim_number
-                                                (JsNumber.neg n)))))
+                                                (JsNumber.neg n))))
             | Coq_unary_op_bitwise_not ->
               let%run  (s2, k) = (to_int32 s1 c v) in 
                   res_ter s2
@@ -3996,19 +3995,19 @@ and run_call_prealloc s c b vthis args =
   match b with
   | Coq_prealloc_global_is_finite ->
     let_binding (get_arg 0 args) (fun v ->
-        if_number (to_number s c v) (fun s0 n ->
+        let%number  (s0, n) = (to_number s c v) in 
             res_ter s0
               (res_val (Coq_value_prim (Coq_prim_bool
                                           (neg
                                              (or_decidable (number_comparable n JsNumber.nan)
                                                 (or_decidable (number_comparable n JsNumber.infinity)
-                                                   (number_comparable n JsNumber.neg_infinity)))))))))
+                                                   (number_comparable n JsNumber.neg_infinity))))))))
   | Coq_prealloc_global_is_nan ->
     let_binding (get_arg 0 args) (fun v ->
-        if_number (to_number s c v) (fun s0 n ->
+        let%number  (s0, n) = (to_number s c v) in 
             res_ter s0
               (res_val (Coq_value_prim (Coq_prim_bool
-                                          (number_comparable n JsNumber.nan))))))
+                                          (number_comparable n JsNumber.nan)))))
   | Coq_prealloc_object ->
     let_binding (get_arg 0 args) (fun value0 ->
         match value0 with
@@ -4257,10 +4256,10 @@ and run_call_prealloc s c b vthis args =
                                                       (fun class0 ->
                                                          if string_comparable class0
                                                              ("Function")
-                                                         then if_number
-                                                             (run_object_get s_2 c thisobj
-                                                                ("length"))
-                                                             (fun s10 n ->
+                                                         then let%number
+                                                             
+                                                             (s10, n) = (run_object_get s_2 c thisobj
+                                                                ("length")) in 
                                                                 let%run
                                                                   
                                                                   (s11, ilen) = (to_int32 s10 c (Coq_value_prim
@@ -4270,7 +4269,7 @@ and run_call_prealloc s c b vthis args =
                                                                      then res_spec s11 0.
                                                                      else res_spec s11
                                                                          (ilen -.
-                                                                          (number_of_int (LibList.length a))))
+                                                                          (number_of_int (LibList.length a)))
                                                          else res_spec s_2 0.)) (fun vlength ->
                                                        let%run  (s10, length0) = (vlength) in 
                                                            let_binding { attributes_data_value =
-- 
GitLab