Compare,
CompareTerm(CompareTermQT),
CyclicTerm,
- Display,
+ Writeq,
DuplicateTerm,
Eq,
Functor,
&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"),
&BuiltInClauseType::Compare => 2,
&BuiltInClauseType::CompareTerm(_) => 2,
&BuiltInClauseType::CyclicTerm => 1,
- &BuiltInClauseType::Display => 1,
+ &BuiltInClauseType::Writeq => 1,
&BuiltInClauseType::DuplicateTerm => 2,
&BuiltInClauseType::Eq => 2,
&BuiltInClauseType::Functor => 3,
("@=<", 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),
use prolog::ast::*;
use prolog::heap_print::*;
use prolog::machine::*;
+use prolog::ordered_float::OrderedFloat;
use termion::raw::IntoRawMode;
use termion::input::TermRead;
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) =>
{
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\"
).");
[["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"]]);
*/
}
[["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"]]);