diff --git a/generator/js_of_ast.ml b/generator/js_of_ast.ml index 2cd78374b8ca4e47af25b7da4e2a6a407b8a26bf..201e1b4b441c3d7e8fb3024c24a9af543bd12167 100644 --- a/generator/js_of_ast.ml +++ b/generator/js_of_ast.ml @@ -11,6 +11,7 @@ open Mytools open Attributes open Log + let hashtbl_size = 256 let type_tbl = Hashtbl.create hashtbl_size let record_tbl = Hashtbl.create hashtbl_size @@ -28,7 +29,7 @@ let print_type_tbl () = in Hashtbl.iter (fun cstr elems -> Printf.printf ({|%s -> [%s]|} ^^ "\n") cstr (print_str_list elems)) type_tbl; () (** - * Useful functions (shadow show_list from Mytools) + * Useful functions (Warning: shadows `show_list' from Mytools) *) let show_list_f f sep l = l @@ -39,7 +40,15 @@ let show_list sep l = List.fold_left (fun acc x -> acc ^ (if acc = "" then "" else sep) ^ x) "" l let is_sbool x = List.mem x ["true" ; "false"] - + +let is_infix f args = match args with + | _ :: [] | [] -> false + | x :: xs -> + let open Location in + let f_loc = (f.exp_loc.loc_start, f.exp_loc.loc_end) in + let args_loc = (x.exp_loc.loc_start, x.exp_loc.loc_end) in + if fst args_loc < fst f_loc then true else false + (** * Before-hand definitions of Pretty-Printer-Format for converting ocaml * to ECMAScript, therefore all of them are in a single place. @@ -66,6 +75,10 @@ let ppf_apply f args = Printf.sprintf "@[<v 0>%s(%s)@]" f args +let ppf_apply_infix f arg1 arg2 = + Printf.sprintf "@[<v 0>%s %s %s@]" + arg1 f arg2 + let ppf_match value cases = let s = Printf.sprintf "switch (%s.type) {@,@[<v 2>@,%s@,@]@,}" @@ -196,11 +209,14 @@ and js_of_expression e = match e.exp_desc with let args, body = explore [c.c_lhs] c.c_rhs in ppf_function args body | Texp_apply (f, exp_l) -> - let sl = exp_l - |> List.map (fun (_, eo, _) -> match eo with None -> out_of_scope "optional apply arguments" | Some ei -> js_of_expression ei) - |> String.concat ", " in - let se = js_of_expression f in - ppf_apply se sl + let sl' = exp_l + |> List.map (fun (_, eo, _) -> match eo with None -> out_of_scope "optional apply arguments" | Some ei -> ei) in + let sl = exp_l + |> List.map (fun (_, eo, _) -> match eo with None -> out_of_scope "optional apply arguments" | Some ei -> js_of_expression ei) in + let se = js_of_expression f in + if is_infix f sl' && List.length exp_l = 2 + then ppf_apply_infix se (List.hd sl) (List.hd (List.tl sl)) + else ppf_apply se (String.concat ", " sl) | Texp_match (exp, l, [], Total) -> let se = js_of_expression exp in let sb = List.fold_left (fun acc x -> acc ^ js_of_branch x se) "" l in @@ -278,7 +294,7 @@ and js_of_let_pattern pat expr = let sexpr = js_of_expression expr in match pat.pat_desc with | Tpat_var (id, _) -> - Printf.sprintf "@[<v 0>var %s = %s;@,@]" (Ident.name id) sexpr + L.log_line (Printf.sprintf "@[<v 0>var %s = %s;@,@]" (Ident.name id) sexpr) (L.Add (Ident.name id)) | Tpat_tuple (pat_l) | Tpat_array (pat_l) -> let l = List.map (function pat -> match pat.pat_desc with diff --git a/generator/log.ml b/generator/log.ml index a1909429442f4e17ec4373f16df9efdf737de681..d17c937077bbe82477968bd34bd8a3be37c9cb94 100644 --- a/generator/log.ml +++ b/generator/log.ml @@ -121,9 +121,9 @@ struct | (None, str) :: xs -> Buffer.add_string buf str; aux xs | (Some x, str) :: xs -> let log_info = match Hashtbl.find info_tbl x with - | Add x -> "print (\"Variable x has been introduced with value: \"); print(x);@," - | Redef x -> "print (\"Variable x has been redefined with value: \"); print(x);@," - | Del x -> "print (\"Variable x has been deleted from the context \");@," + | Add x -> "@[<v 0>@,print (\"Variable " ^ x ^ " has been introduced with value: \");@,print("^ x ^");@,@]" + | Redef x -> "print (\"Variable " ^ x ^ " has been redefined with value: \"); print("^ x ^");@," + | Del x -> "print (\"Variable " ^ x ^ " has been deleted from the context \");@," in Buffer.add_string buf str; Buffer.add_string buf log_info; aux xs diff --git a/generator/stdlib_ml/stdlib.mli b/generator/stdlib_ml/stdlib.mli index ab7efeca1340bb672ec00206ec1fa8f2242d8a63..4a65911fbd2c4facf00a0d840c7c0717a0f1d78e 100644 --- a/generator/stdlib_ml/stdlib.mli +++ b/generator/stdlib_ml/stdlib.mli @@ -1,14 +1,23 @@ val add : 'a -> 'a -> 'a +val ( + ) : 'a -> 'a -> 'a val sub : 'a -> 'a -> 'a +val ( - ) : 'a -> 'a -> 'a val mul : 'a -> 'a -> 'a +val ( * ) : 'a -> 'a -> 'a val div : 'a -> 'a -> 'a - +val ( / ) : 'a -> 'a -> 'a + val eq : 'a -> 'a -> bool +val ( === ) : 'a -> 'a -> 'a val le : 'a -> 'a -> bool +val ( < ) : 'a -> 'a -> 'a val ge : 'a -> 'a -> bool +val ( > ) : 'a -> 'a -> 'a val leq : 'a -> 'a -> bool +val ( <= ) : 'a -> 'a -> 'a val geq : 'a -> 'a -> bool +val ( >= ) : 'a -> 'a -> 'a val print : 'a -> unit diff --git a/generator/tests/calc.ml b/generator/tests/calc.ml index be11a5da53938c9e1f0982ebf4021f572e101ab4..74fae755c3ad3a2ca6c58c4a8e86079a18bd0da0 100644 --- a/generator/tests/calc.ml +++ b/generator/tests/calc.ml @@ -7,18 +7,18 @@ type expr = let rec eval_ expr = match expr with | Const n -> n - | Add (ls, rs) -> add (eval_ ls) (eval_ rs) - | Sub (ls, rs) -> sub (eval_ ls) (eval_ rs) - | Mul (ls, rs) -> mul (eval_ ls) (eval_ rs) - | Div (ls, rs) -> div (eval_ ls) (eval_ rs) + | Add (ls, rs) -> eval_ ls + eval_ rs + | Sub (ls, rs) -> eval_ ls - eval_ rs + | Mul (ls, rs) -> eval_ ls * eval_ rs + | Div (ls, rs) -> eval_ ls / eval_ rs let rec print_expr expr = match expr with | Const n -> to_string n - | Add (ls, rs) -> (add (add (add (add "(" (print_expr ls)) ")") " + ") (print_expr rs)) - | Sub (ls, rs) -> (add (add (add (add "(" (print_expr ls)) ")") " - ") (print_expr rs)) - | Mul (ls, rs) -> (add (add (add (add "(" (print_expr ls)) ")") " * ") (print_expr rs)) - | Div (ls, rs) -> (add (add (add (add "(" (print_expr ls)) ")") " / ") (print_expr rs)) + | Add (ls, rs) -> "(" + (print_expr ls) + ")" + " + " + (print_expr rs) + | Sub (ls, rs) -> "(" + (print_expr ls) + ")" + " - " + (print_expr rs) + | Mul (ls, rs) -> "(" + (print_expr ls) + ")" + " * " + (print_expr rs) + | Div (ls, rs) -> "(" + (print_expr ls) + ")" + " / " + (print_expr rs) let f = let source = parse "((1972 / 29) / 2) + 8" in - print (add (add (print_expr source) " = ") (to_string (eval_ source))) + print ((print_expr source) + " = " + to_string (eval_ source))