open Lambda open Parser open Tools (* --------------------------------------- Prompt --------------------------------------- *) let welcome () = print_endline "Use 'help' for the list of commands." let tab = repeat_string "\t" let line = repeat_string "-" let commands_list () = print_endline ("Command" ^ tab 4 ^ "Description (shortcut)"); print_endline (line 70); print_endline ("exit" ^ tab 4 ^ "Exits the program"); print_endline ("display " ^ tab 2 ^ "Displays the written lambda with the pretty printer"); print_endline ("cbn -f " ^ tab 2 ^ "Eval the lambda term using call by name strategy"); print_endline ("cbv -f " ^ tab 2 ^ "Eval the lambda term using call by value strategy"); print_endline ("lo -f " ^ tab 2 ^ "Eval the lambda term using the lo reduction strategy") let prompt () = print_string "> " let last_command : string option ref = ref None (* --------------------------------------- Main function --------------------------------------- *) let _ = welcome (); while true do prompt (); let input = read_line () in begin match String.split_on_char ' ' input with | ["exit"] -> exit 0 | ["help"] -> commands_list () (*| _ as string_list -> let lexbuf = Lexing.from_string (String.concat " " string_list) in (try let t = termc Lexer.read lexbuf in (* print_endline (String.concat " " string_list); *) print_endline (string_of_term t) with _ -> print_endline "Syntax error. Please try again.")*) | "display"::string_list -> let lexbuf = Lexing.from_string (String.concat " " string_list) in (try let t = termc Lexer.read lexbuf in print_endline (string_of_term t) with _ -> print_endline "Syntax error. Please try again.") | "alpha"::string_list -> let lexbuf = Lexing.from_string (String.concat " " string_list) in (try let t = termc Lexer.read lexbuf in print_endline (string_of_term (alpha_conv t)) with _ -> print_endline "Syntax error. Please try again.") | ["cbn"; "-f"; filename] -> begin try let lexbuf = Lexing.from_channel (open_in filename) in let t = termc Lexer.read lexbuf in let result = cbn_eval t in print_endline (string_of_term result) with Sys_error f -> print_endline f end | ["cbv"; "-f"; filename] -> begin try let lexbuf = Lexing.from_channel (open_in filename) in let t = termc Lexer.read lexbuf in let result = cbv_eval t in print_endline (string_of_term result) with Sys_error f -> print_endline f end | ["lo"; "-f"; filename] -> begin try let lexbuf = Lexing.from_channel (open_in filename) in let t = termc Lexer.read lexbuf in let result = lo_eval t in print_endline (string_of_term result) with Sys_error f -> print_endline f end | "cbn"::string_list -> let lexbuf = Lexing.from_string (String.concat " " string_list) in (try let t = termc Lexer.read lexbuf in let result = cbn_eval t in print_endline (string_of_term result) with _ -> print_endline "Syntax error. Please try again.") | "cbv"::string_list -> let lexbuf = Lexing.from_string (String.concat " " string_list) in (try let t = termc Lexer.read lexbuf in let result = cbv_eval t in print_endline (string_of_term result) with _ -> print_endline "Syntax error. Please try again.") | "lo"::string_list -> let lexbuf = Lexing.from_string (String.concat " " string_list) in (try let t = termc Lexer.read lexbuf in let result = lo_eval t in print_endline (string_of_term result) with _ -> print_endline "Syntax error. Please try again.") | _ -> print_endline "Invalid command. Please type 'help' for the list of commands." end done