diff options
| -rw-r--r-- | src/isail.ml | 165 |
1 files changed, 107 insertions, 58 deletions
diff --git a/src/isail.ml b/src/isail.ml index 7c4affa3..dc7858c9 100644 --- a/src/isail.ml +++ b/src/isail.ml @@ -193,34 +193,75 @@ let rec run () = match !current_mode with | Normal | Emacs -> () | Evaluation frame -> - begin - match frame with - | Done (state, v) -> - interactive_state := state; - print_endline ("Result = " ^ Value.string_of_value v); - current_mode := Normal - | Fail (_, _, _, _, msg) -> - print_endline ("Error: " ^ msg); - current_mode := Normal - | Step (out, state, _, stack) -> - begin - try - current_mode := Evaluation (eval_frame frame) - with - | Failure str -> print_endline str; current_mode := Normal - end; - run () - | Break frame -> - print_endline "Breakpoint"; - current_mode := Evaluation frame - | Effect_request (out, state, stack, eff) -> - begin - try - current_mode := Evaluation (!Interpreter.effect_interp state eff) - with - | Failure str -> print_endline str; current_mode := Normal - end; - run () + begin match frame with + | Done (state, v) -> + interactive_state := state; + print_endline ("Result = " ^ Value.string_of_value v); + current_mode := Normal + | Fail (_, _, _, _, msg) -> + print_endline ("Error: " ^ msg); + current_mode := Normal + | Step (out, state, _, stack) -> + begin + try + current_mode := Evaluation (eval_frame frame) + with + | Failure str -> print_endline str; current_mode := Normal + end; + run () + | Break frame -> + print_endline "Breakpoint"; + current_mode := Evaluation frame + | Effect_request (out, state, stack, eff) -> + begin + try + current_mode := Evaluation (!Interpreter.effect_interp state eff) + with + | Failure str -> print_endline str; current_mode := Normal + end; + run () + end + +let rec run_function depth = + let run_function' stack = + match depth with + | None -> run_function (Some (List.length stack)) + | Some n -> + if List.compare_length_with stack n >= 0 then + run_function depth + else + () + in + match !current_mode with + | Normal | Emacs -> () + | Evaluation frame -> + begin match frame with + | Done (state, v) -> + interactive_state := state; + print_endline ("Result = " ^ Value.string_of_value v); + current_mode := Normal + | Fail (_, _, _, _, msg) -> + print_endline ("Error: " ^ msg); + current_mode := Normal + | Step (out, state, _, stack) -> + begin + try + current_mode := Evaluation (eval_frame frame) + with + | Failure str -> print_endline str; current_mode := Normal + end; + run_function' stack + | Break frame -> + print_endline "Breakpoint"; + current_mode := Evaluation frame + | Effect_request (out, state, stack, eff) -> + begin + try + current_mode := Evaluation (!Interpreter.effect_interp state eff) + with + | Failure str -> print_endline str; current_mode := Normal + end; + run_function' stack end let rec run_steps n = @@ -228,36 +269,35 @@ let rec run_steps n = | _ when n <= 0 -> () | Normal | Emacs -> () | Evaluation frame -> - begin - match frame with - | Done (state, v) -> - interactive_state := state; - print_endline ("Result = " ^ Value.string_of_value v); - current_mode := Normal - | Fail (_, _, _, _, msg) -> - print_endline ("Error: " ^ msg); - current_mode := Normal - | Step (out, state, _, stack) -> - begin - try - current_mode := Evaluation (eval_frame frame) - with - | Failure str -> print_endline str; current_mode := Normal - end; - run_steps (n - 1) - | Break frame -> - print_endline "Breakpoint"; - current_mode := Evaluation frame - | Effect_request (out, state, stack, eff) -> - begin - try - current_mode := Evaluation (!Interpreter.effect_interp state eff) - with - | Failure str -> print_endline str; current_mode := Normal - end; - run_steps (n - 1) + begin match frame with + | Done (state, v) -> + interactive_state := state; + print_endline ("Result = " ^ Value.string_of_value v); + current_mode := Normal + | Fail (_, _, _, _, msg) -> + print_endline ("Error: " ^ msg); + current_mode := Normal + | Step (out, state, _, stack) -> + begin + try + current_mode := Evaluation (eval_frame frame) + with + | Failure str -> print_endline str; current_mode := Normal + end; + run_steps (n - 1) + | Break frame -> + print_endline "Breakpoint"; + current_mode := Evaluation frame + | Effect_request (out, state, stack, eff) -> + begin + try + current_mode := Evaluation (!Interpreter.effect_interp state eff) + with + | Failure str -> print_endline str; current_mode := Normal + end; + run_steps (n - 1) end - + let help = let open Printf in let open Util in @@ -298,6 +338,8 @@ let help = | ":s" | ":step" -> sprintf "(:s | :step) %s - Perform a number of evaluation steps." (color yellow "<number>") + | ":f" | ":step_function" -> + sprintf "(:s | :step) - Perform evaluation steps until the currently evaulating function returns." | ":n" | ":normal" -> "(:n | :normal) - Exit evaluation mode back to normal mode." | ":clear" -> @@ -422,6 +464,9 @@ let handle_input' input = let cmd = Str.string_before input n in let arg = String.trim (Str.string_after input n) in Command (cmd, arg) + else if String.length input >= 2 && input.[0] = '/' && input.[1] = '/' then + (* Treat anything starting with // as a comment *) + Empty else if input <> "" then Expression input else @@ -693,7 +738,11 @@ let handle_input' input = | ":r" | ":run" -> run () | ":s" | ":step" -> - run_steps (int_of_string arg) + run_steps (int_of_string arg); + print_program () + | ":f" | ":step_function" -> + run_function None; + print_program () | _ -> unrecognised_command cmd end | Expression str -> |
