From f5e254dd64395d7421b6b1cf6d2d52ebc245d9b7 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 15 Jul 2018 17:54:37 -0600 Subject: [PATCH] add support for quoted atoms to writeq --- src/prolog/ast.rs | 8 ++++---- src/prolog/io.rs | 24 +++++++++++++++++++----- src/prolog/machine/machine_state.rs | 2 +- src/prolog/mod.rs | 2 +- src/prolog/parser | 2 +- src/tests.rs | 28 ++++++++++++++-------------- 6 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 51b6cce7..f60639bc 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -795,7 +795,7 @@ pub enum BuiltInClauseType { Compare, CompareTerm(CompareTermQT), CyclicTerm, - Display, + Writeq, DuplicateTerm, Eq, Functor, @@ -898,7 +898,7 @@ impl BuiltInClauseType { &BuiltInClauseType::Compare => clause_name!("compare"), &BuiltInClauseType::CompareTerm(qt) => clause_name!(qt.name()), &BuiltInClauseType::CyclicTerm => clause_name!("cyclic_term"), - &BuiltInClauseType::Display => clause_name!("display"), + &BuiltInClauseType::Writeq => clause_name!("writeq"), &BuiltInClauseType::DuplicateTerm => clause_name!("duplicate_term"), &BuiltInClauseType::Eq => clause_name!("=="), &BuiltInClauseType::Functor => clause_name!("functor"), @@ -917,7 +917,7 @@ impl BuiltInClauseType { &BuiltInClauseType::Compare => 2, &BuiltInClauseType::CompareTerm(_) => 2, &BuiltInClauseType::CyclicTerm => 1, - &BuiltInClauseType::Display => 1, + &BuiltInClauseType::Writeq => 1, &BuiltInClauseType::DuplicateTerm => 2, &BuiltInClauseType::Eq => 2, &BuiltInClauseType::Functor => 3, @@ -941,7 +941,7 @@ impl BuiltInClauseType { ("@=<", 2) => Some(BuiltInClauseType::CompareTerm(CompareTermQT::LessThanOrEqual)), ("\\=@=", 2) => Some(BuiltInClauseType::CompareTerm(CompareTermQT::NotEqual)), ("=@=", 2) => Some(BuiltInClauseType::CompareTerm(CompareTermQT::Equal)), - ("display", 1) => Some(BuiltInClauseType::Display), + ("writeq", 1) => Some(BuiltInClauseType::Writeq), ("duplicate_term", 2) => Some(BuiltInClauseType::DuplicateTerm), ("==", 2) => Some(BuiltInClauseType::Eq), ("functor", 3) => Some(BuiltInClauseType::Functor), diff --git a/src/prolog/io.rs b/src/prolog/io.rs index 7f346b45..d162bc95 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -1,6 +1,7 @@ use prolog::ast::*; use prolog::heap_print::*; use prolog::machine::*; +use prolog::ordered_float::OrderedFloat; use termion::raw::IntoRawMode; use termion::input::TermRead; @@ -24,17 +25,30 @@ impl fmt::Display for IndexPtr { impl fmt::Display for Constant { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn print_atom(f: &mut fmt::Formatter, atom: &ClauseName) -> fmt::Result { + let non_quoted_token = |c| { + graphic_token_char!(c) || alpha_numeric_char!(c) + }; + + match atom.as_str() { + ";" | "!" => write!(f, "{}", atom.as_str()), + s => if s.chars().all(non_quoted_token) { + write!(f, "{}", atom.as_str()) + } else { + write!(f, "{}", "'".to_owned() + atom.as_str() + "'") + } + } + } + match self { &Constant::Atom(ref atom) => - if atom.as_str().chars().any(|c| ".$'\" ".contains(c)) { - write!(f, "'{}'", atom.as_str()) - } else { - write!(f, "{}", atom.as_str()) - }, + print_atom(f, atom), &Constant::Char(c) => write!(f, "'{}'", c as u8), &Constant::EmptyList => write!(f, "[]"), + &Constant::Number(Number::Float(ref fl)) if fl == &OrderedFloat(0f64) => + write!(f, "0"), &Constant::Number(ref n) => write!(f, "{}", n), &Constant::String(ref s) => diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index 8e1a9a04..82570099 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -492,7 +492,7 @@ pub(crate) trait CallPolicy: Any { machine_st.fail = !machine_st.is_cyclic_term(addr); return_from_clause!(machine_st.last_call, machine_st) }, - &BuiltInClauseType::Display => { + &BuiltInClauseType::Writeq => { let output = machine_st.print_term(machine_st[temp_v!(1)].clone(), DisplayFormatter {}, PrinterOutputter::new()); diff --git a/src/prolog/mod.rs b/src/prolog/mod.rs index 511a1f86..e6209c32 100644 --- a/src/prolog/mod.rs +++ b/src/prolog/mod.rs @@ -19,10 +19,10 @@ pub mod fixtures; pub mod heap_iter; pub mod heap_print; pub mod indexing; -pub mod io; pub mod iterators; pub mod or_stack; #[macro_use] pub mod parser; +pub mod io; pub mod targets; pub mod tabled_rc; diff --git a/src/prolog/parser b/src/prolog/parser index a7b81b59..6a754525 160000 --- a/src/prolog/parser +++ b/src/prolog/parser @@ -1 +1 @@ -Subproject commit a7b81b591bce10f93a5f835336c588be763516c6 +Subproject commit 6a7545257bbfc660b37a0bc3d7a72edb244dda86 diff --git a/src/tests.rs b/src/tests.rs index 0cd3d032..8f1eff71 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1207,8 +1207,8 @@ fn test_queries_on_conditionals() { let mut wam = Machine::new(); - submit(&mut wam, "test(A) :- ( A =:= 2 -> display(\"A is 2\") - ; A =:= 3 -> display(\"A is 3\") + submit(&mut wam, "test(A) :- ( A =:= 2 -> writeq(\"A is 2\") + ; A =:= 3 -> writeq(\"A is 3\") ; A = \"not 2 or 3\" )."); @@ -1551,9 +1551,9 @@ fn test_queries_on_builtins() [["G = 2", "B = 3"]]); /* - assert_prolog_success!(&mut wam, "?- call_with_inference_limit((setup_call_cleanup(S=1,(G=2;fail),display(S+G>B)), B=3, !), 100, R).", + assert_prolog_success!(&mut wam, "?- call_with_inference_limit((setup_call_cleanup(S=1,(G=2;fail),writeq(S+G>B)), B=3, !), 100, R).", [["G = 2", "B = 3", "R = !", "S = 1"]]); - assert_prolog_success!(&mut wam, "?- call_with_inference_limit((setup_call_cleanup(S=1,(G=2;fail),display(S+G>B)), B=3, !), 10, R).", + assert_prolog_success!(&mut wam, "?- call_with_inference_limit((setup_call_cleanup(S=1,(G=2;fail),writeq(S+G>B)), B=3, !), 10, R).", [["S = _1", "G = _4", "B = _14", "R = inference_limit_exceeded"]]); */ } @@ -1582,32 +1582,32 @@ fn test_queries_on_setup_call_cleanup() [["S = 1", "G = 2", "C = 3"]]); assert_prolog_success!(&mut wam, "?- setup_call_cleanup((S=1;S=2), G=3, C=4).", [["S = 1", "G = 3", "C = 4"]]); - assert_prolog_success!(&mut wam, "?- setup_call_cleanup(S=1, G=2, display(S+G)).", + assert_prolog_success!(&mut wam, "?- setup_call_cleanup(S=1, G=2, writeq(S+G)).", [["S = 1", "G = 2"]]); - assert_prolog_success!(&mut wam, "?- setup_call_cleanup(S=1, (G=2;G=3), display(S+G)).", + assert_prolog_success!(&mut wam, "?- setup_call_cleanup(S=1, (G=2;G=3), writeq(S+G)).", [["S = 1", "G = 2"], ["S = 1", "G = 3"]]); - assert_prolog_success!(&mut wam, "?- setup_call_cleanup(S=1, G=2, display(S+G>A+B)), A=3, B=4.", + assert_prolog_success!(&mut wam, "?- setup_call_cleanup(S=1, G=2, writeq(S+G>A+B)), A=3, B=4.", [["S = 1", "G = 2", "A = 3", "B = 4"]]); assert_prolog_success!(&mut wam, - "?- catch(setup_call_cleanup(S=1, (G=2;G=3,throw(x)), display(S+G)), E, true).", + "?- catch(setup_call_cleanup(S=1, (G=2;G=3,throw(x)), writeq(S+G)), E, true).", [["S = 1", "G = 2", "E = _26"], ["G = _4", "E = x", "S = _1"]]); assert_prolog_success!(&mut wam, - "?- setup_call_cleanup(S=1, (G=2;G=3),display(S+G>B)), B=4, !.", + "?- setup_call_cleanup(S=1, (G=2;G=3),writeq(S+G>B)), B=4, !.", [["S = 1", "B = 4", "G = 2"]]); assert_prolog_success!(&mut wam, - "?- setup_call_cleanup(S=1,G=2,display(S+G>B)),B=3,!.", + "?- setup_call_cleanup(S=1,G=2,writeq(S+G>B)),B=3,!.", [["S = 1", "G = 2", "B = 3"]]); assert_prolog_success!(&mut wam, - "?- setup_call_cleanup(S=1,(G=2;false),display(S+G>B)),B=3,!.", + "?- setup_call_cleanup(S=1,(G=2;false),writeq(S+G>B)),B=3,!.", [["S = 1", "G = 2", "B = 3"]]); assert_prolog_success!(&mut wam, - "?- setup_call_cleanup(S=1,(G=2;S=2),display(S+G>B)), B=3, !.", + "?- setup_call_cleanup(S=1,(G=2;S=2),writeq(S+G>B)), B=3, !.", [["S = 1", "B = 3", "G = 2"]]); assert_prolog_failure!(&mut wam, - "?- setup_call_cleanup(S=1,(G=2;G=3), display(S+G>B)), B=4, !, throw(x)."); + "?- setup_call_cleanup(S=1,(G=2;G=3), writeq(S+G>B)), B=4, !, throw(x)."); assert_prolog_success!(&mut wam, - "?- setup_call_cleanup(true, (X=1;X=2), display(a)), setup_call_cleanup(true,(Y=1;Y=2),display(b)), !.", + "?- setup_call_cleanup(true, (X=1;X=2), writeq(a)), setup_call_cleanup(true,(Y=1;Y=2),writeq(b)), !.", [["Y = 1", "X = 1"]]); assert_prolog_success!(&mut wam, "?- catch(setup_call_cleanup(true,throw(goal),throw(cl)), Pat, true).", [["Pat = goal"]]); -- 2.54.0