Add command line option to enable implicitly generated bindings
This commit is contained in:
parent
1639367765
commit
8ed78f2e39
|
@ -70,6 +70,7 @@ type syntax =
|
||||||
| Camlp4r
|
| Camlp4r
|
||||||
|
|
||||||
let hide_reserved, get_hide_reserved, set_hide_reserved = make_variable true
|
let hide_reserved, get_hide_reserved, set_hide_reserved = make_variable true
|
||||||
|
let create_implicits, get_create_implicits, set_create_implicits = make_variable false
|
||||||
let show_box, get_show_box, set_show_box = make_variable true
|
let show_box, get_show_box, set_show_box = make_variable true
|
||||||
let syntax, get_syntax, set_syntax = make_variable Normal
|
let syntax, get_syntax, set_syntax = make_variable Normal
|
||||||
let phrase_terminator, get_phrase_terminator, set_phrase_terminator = make_variable ";;"
|
let phrase_terminator, get_phrase_terminator, set_phrase_terminator = make_variable ";;"
|
||||||
|
|
|
@ -50,6 +50,24 @@ val get_hide_reserved : unit -> bool
|
||||||
val set_hide_reserved : bool -> unit
|
val set_hide_reserved : bool -> unit
|
||||||
(** Modifies {!hide_reserved}. *)
|
(** Modifies {!hide_reserved}. *)
|
||||||
|
|
||||||
|
val create_implicits : bool signal
|
||||||
|
(** If [true] (not the default) expressions entered in the toplevel are
|
||||||
|
automatically bound, for example:
|
||||||
|
|
||||||
|
{[
|
||||||
|
# 3 + 4;;
|
||||||
|
_0 : int = 7
|
||||||
|
# _0 + 10;;
|
||||||
|
_1 : int = 17
|
||||||
|
]}
|
||||||
|
*)
|
||||||
|
|
||||||
|
val get_create_implicits : unit -> bool
|
||||||
|
(** Returns the value of {!create_implicits}. *)
|
||||||
|
|
||||||
|
val set_create_implicits : bool -> unit
|
||||||
|
(** Modifies {!create_implicits}. *)
|
||||||
|
|
||||||
val topfind_verbose : bool signal
|
val topfind_verbose : bool signal
|
||||||
(** If [false] (the default) messages from findlib are hidden. This is only effective
|
(** If [false] (the default) messages from findlib are hidden. This is only effective
|
||||||
with findlib >= 1.4. *)
|
with findlib >= 1.4. *)
|
||||||
|
|
|
@ -307,6 +307,15 @@ let render_out_phrase term string =
|
||||||
let orig_print_out_signature = !Toploop.print_out_signature
|
let orig_print_out_signature = !Toploop.print_out_signature
|
||||||
let orig_print_out_phrase = !Toploop.print_out_phrase
|
let orig_print_out_phrase = !Toploop.print_out_phrase
|
||||||
|
|
||||||
|
let is_implicit_name name =
|
||||||
|
name <> "" &&
|
||||||
|
name.[0] = '_' &&
|
||||||
|
try
|
||||||
|
let _ = int_of_string @@ String.sub name 1 (String.length name - 1) in
|
||||||
|
true
|
||||||
|
with
|
||||||
|
Failure _ -> false
|
||||||
|
|
||||||
let rec map_items unwrap wrap items =
|
let rec map_items unwrap wrap items =
|
||||||
match items with
|
match items with
|
||||||
| [] ->
|
| [] ->
|
||||||
|
@ -331,7 +340,11 @@ let rec map_items unwrap wrap items =
|
||||||
| Outcometree.Osig_ellipsis -> ("", Outcometree.Orec_not)
|
| Outcometree.Osig_ellipsis -> ("", Outcometree.Orec_not)
|
||||||
#endif
|
#endif
|
||||||
in
|
in
|
||||||
let keep = name = "" || name.[0] <> '_' in
|
|
||||||
|
let keep =
|
||||||
|
name = "" || name.[0] <> '_' ||
|
||||||
|
(UTop.get_create_implicits () && is_implicit_name name)
|
||||||
|
in
|
||||||
if keep then
|
if keep then
|
||||||
item :: map_items unwrap wrap items
|
item :: map_items unwrap wrap items
|
||||||
else
|
else
|
||||||
|
@ -567,15 +580,15 @@ let add_let binding_name def =
|
||||||
pstr_loc;
|
pstr_loc;
|
||||||
pstr_desc = Pstr_value (Asttypes.Nonrecursive, [
|
pstr_desc = Pstr_value (Asttypes.Nonrecursive, [
|
||||||
{
|
{
|
||||||
pvb_pat = {
|
pvb_pat = {
|
||||||
ppat_desc = Ppat_var { txt = binding_name; loc = pstr_loc; };
|
ppat_desc = Ppat_var { txt = binding_name; loc = pstr_loc; };
|
||||||
ppat_loc = pstr_loc;
|
ppat_loc = pstr_loc;
|
||||||
ppat_attributes = [];
|
ppat_attributes = [];
|
||||||
};
|
};
|
||||||
pvb_expr = expr;
|
pvb_expr = expr;
|
||||||
pvb_attributes = attr;
|
pvb_attributes = attr;
|
||||||
pvb_loc = pstr_loc;
|
pvb_loc = pstr_loc;
|
||||||
}]);
|
}]);
|
||||||
}
|
}
|
||||||
| _ ->
|
| _ ->
|
||||||
def
|
def
|
||||||
|
@ -637,8 +650,14 @@ let rec loop term =
|
||||||
| Some phrase ->
|
| Some phrase ->
|
||||||
(* Rewrite toplevel expressions. *)
|
(* Rewrite toplevel expressions. *)
|
||||||
let count = S.value UTop_private.count in
|
let count = S.value UTop_private.count in
|
||||||
let binding_name = Printf.sprintf "_%d" count in
|
let phrase = rewrite phrase in
|
||||||
let phrase = bind_expressions binding_name @@ rewrite phrase in
|
let phrase =
|
||||||
|
if UTop.get_create_implicits () then
|
||||||
|
let binding_name = Printf.sprintf "_%d" count in
|
||||||
|
bind_expressions binding_name phrase
|
||||||
|
else
|
||||||
|
phrase
|
||||||
|
in
|
||||||
(* Set the margin of standard formatters. *)
|
(* Set the margin of standard formatters. *)
|
||||||
UTop_private.set_margin Format.std_formatter;
|
UTop_private.set_margin Format.std_formatter;
|
||||||
UTop_private.set_margin Format.err_formatter;
|
UTop_private.set_margin Format.err_formatter;
|
||||||
|
@ -1203,6 +1222,10 @@ let args = Arg.align [
|
||||||
" Hide identifiers starting with a '_' (the default)";
|
" Hide identifiers starting with a '_' (the default)";
|
||||||
"-show-reserved", Arg.Unit (fun () -> UTop.set_hide_reserved false),
|
"-show-reserved", Arg.Unit (fun () -> UTop.set_hide_reserved false),
|
||||||
" Show identifiers starting with a '_'";
|
" Show identifiers starting with a '_'";
|
||||||
|
"-no-implicit-bindings", Arg.Unit (fun () -> UTop.set_create_implicits false),
|
||||||
|
" Don't add implicit bindings for expressions (the default)";
|
||||||
|
"-implicit-bindings", Arg.Unit (fun () -> UTop.set_create_implicits true),
|
||||||
|
" Add implicit bindings: <expr>;; -> let _0 = <expr>;;";
|
||||||
"-no-autoload", Arg.Clear autoload,
|
"-no-autoload", Arg.Clear autoload,
|
||||||
" Disable autoloading of files in $OCAML_TOPLEVEL_PATH/autoload";
|
" Disable autoloading of files in $OCAML_TOPLEVEL_PATH/autoload";
|
||||||
"-require", Arg.String (fun s -> preload := `Packages (UTop.split_words s) :: !preload),
|
"-require", Arg.String (fun s -> preload := `Packages (UTop.split_words s) :: !preload),
|
||||||
|
|
Loading…
Reference in New Issue