From bef96e231dc9b3f3ab97b814e318ff9819a5ec2c Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 15 Mar 2020 00:35:59 -0600 Subject: [PATCH] use max_depth at toplevel, allowing full printing of terms with the 'w' keypress (#287), put disjunctions on new lines (#278) --- src/prolog/heap_print.rs | 6 +--- src/prolog/machine/system_calls.rs | 9 +++-- src/prolog/toplevel.pl | 54 +++++++++++++++++------------- 3 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index 4897c7ae..d49a8709 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -842,7 +842,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { return iter.next(); } else { iter.stack().pop(); - + push_space_if_amb!(self, &var, { self.append_str(&var); }); @@ -1192,11 +1192,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { let cell = Rc::new(Cell::new((true, 0))); self.state_stack.push(TokenOrRedirect::CloseList(cell.clone())); - self.state_stack.push(TokenOrRedirect::Atom(clause_name!("..."))); - self.state_stack.push(TokenOrRedirect::HeadTailSeparator); // bar - self.state_stack.push(TokenOrRedirect::Atom(clause_name!("..."))); - self.state_stack.push(TokenOrRedirect::OpenList(cell)); return; diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index c4cf4b2b..2b521d40 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -33,6 +33,7 @@ use crate::crossterm::terminal::{enable_raw_mode, disable_raw_mode}; pub enum ContinueResult { ContinueQuery, Conclude, + PrintWithoutMaxDepth, } pub fn next_keypress() -> ContinueResult { @@ -40,6 +41,9 @@ pub fn next_keypress() -> ContinueResult { match read() { Ok(Event::Key(KeyEvent { code, .. })) => { match code { + KeyCode::Char('w') => { + return ContinueResult::PrintWithoutMaxDepth; + } KeyCode::Char(' ') | KeyCode::Char(';') | KeyCode::Char('n') => { return ContinueResult::ContinueQuery; } @@ -2342,7 +2346,8 @@ impl MachineState { let c = match keypress { ContinueResult::ContinueQuery => ';', - ContinueResult::Conclude => '.' + ContinueResult::Conclude => '.', + ContinueResult::PrintWithoutMaxDepth => 'w', }; let target = self[temp_v!(1)].clone(); @@ -2667,7 +2672,7 @@ impl MachineState { let ignore_ops = self.store(self.deref(self[temp_v!(2)].clone())); let numbervars = self.store(self.deref(self[temp_v!(3)].clone())); let quoted = self.store(self.deref(self[temp_v!(4)].clone())); - let max_depth = self.store(self.deref(self[temp_v!(6)].clone())); + let max_depth = self.store(self.deref(self[temp_v!(6)].clone())); let mut printer = HCPrinter::new(&self, &indices.op_dir, PrinterOutputter::new()); diff --git a/src/prolog/toplevel.pl b/src/prolog/toplevel.pl index 59d1884d..edf00883 100644 --- a/src/prolog/toplevel.pl +++ b/src/prolog/toplevel.pl @@ -46,7 +46,7 @@ ( expand_goals(Term0, Term) -> true ; Term0 = Term ), - ( '$get_b_value'(B), call(Term), '$write_eqs_and_read_input'(B, VarList), + ( '$get_b_value'(B), write(' '), call(Term), '$write_eqs_and_read_input'(B, VarList), ! % clear attribute goal lists, which may be populated by % copy_term/3 prior to failure. @@ -94,7 +94,7 @@ ; VarName = VarName0, N1 is N + 1 ). - + '$extend_var_list'(Value, VarList, NewVarList) :- term_variables(Value, Vars), '$extend_var_list_'(Vars, 0, VarList, NewVarList). @@ -108,30 +108,30 @@ '$extend_var_list_'(Vs, N1, VarList, NewVarList0) ). -'$write_goal'(G, VarList) :- +'$write_goal'(G, VarList, MaxDepth) :- ( G = (Var = Value) -> write(Var), write(' = '), ( '$needs_bracketing'(Value, (=)) -> write('('), - write_term(Value, [quoted(true), variable_names(VarList), max_depth(0)]), + write_term(Value, [quoted(true), variable_names(VarList), max_depth(MaxDepth)]), write(')') - ; write_term(Value, [quoted(true), variable_names(VarList), max_depth(0)]) + ; write_term(Value, [quoted(true), variable_names(VarList), max_depth(MaxDepth)]) ) ; G == [] -> write('true') - ; write_term(G, [quoted(true), variable_names(VarList)]) + ; write_term(G, [quoted(true), variable_names(VarList), max_depth(MaxDepth)]) ). -'$write_last_goal'(G, VarList) :- +'$write_last_goal'(G, VarList, MaxDepth) :- ( G = (Var = Value) -> write(Var), write(' = '), ( '$needs_bracketing'(Value, (=)) -> write('('), - write_term(Value, [quoted(true), variable_names(VarList), max_depth(0)]), + write_term(Value, [quoted(true), variable_names(VarList), max_depth(MaxDepth)]), write(')') - ; write_term(Value, [quoted(true), variable_names(VarList), max_depth(0)]), + ; write_term(Value, [quoted(true), variable_names(VarList), max_depth(MaxDepth)]), ( '$trailing_period_is_ambiguous'(Value) -> write(' ') ; true @@ -139,16 +139,16 @@ ) ; G == [] -> write('true') - ; write_term(G, [quoted(true), variable_names(VarList), max_depth(0)]) + ; write_term(G, [quoted(true), variable_names(VarList), max_depth(MaxDepth)]) ). -'$write_eq'((G1, G2), VarList) :- +'$write_eq'((G1, G2), VarList, MaxDepth) :- !, - '$write_goal'(G1, VarList), + '$write_goal'(G1, VarList, MaxDepth), write(', '), - '$write_eq'(G2, VarList). -'$write_eq'(G, VarList) :- - '$write_last_goal'(G, VarList). + '$write_eq'(G2, VarList, MaxDepth). +'$write_eq'(G, VarList, MaxDepth) :- + '$write_last_goal'(G, VarList, MaxDepth). '$graphic_token_char'(C) :- memberchk(C, ['#', '$', '&', '*', '+', '-', '.', ('/'), ':', @@ -173,18 +173,26 @@ ( Goals == [] -> write('true.'), nl ; thread_goals(Goals, ThreadedGoals, (',')), - '$write_eq'(ThreadedGoals, NewVarList), + '$write_eq'(ThreadedGoals, NewVarList, 20), write('.'), nl ) ; thread_goals(Goals, ThreadedGoals, (',')), - '$write_eq'(ThreadedGoals, NewVarList), - '$raw_input_read_char'(C), - ( C == (';'), !, - write(' ;'), nl, false - ; C == ('.'), !, - write(' ...'), nl - ) + '$write_eq'(ThreadedGoals, NewVarList, 20), + '$read_input'(ThreadedGoals, NewVarList) + ). + +'$read_input'(ThreadedGoals, NewVarList) :- + '$raw_input_read_char'(C), + ( C == ('w'), !, + nl, + write(' '), + '$write_eq'(ThreadedGoals, NewVarList, 0), + '$read_input'(ThreadedGoals, NewVarList) + ; C == (';'), !, + nl, write('; '), false + ; C == ('.'), !, + nl, write(' ...'), nl ). '$gather_query_vars'([_ = Var | Vars], QueryVars) :- -- 2.54.0