From 07ec2d34c887be1e8396c934dc540c23f1ea68e7 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 28 May 2018 20:07:34 -0600 Subject: [PATCH] hacky workaround --- src/prolog/ast.rs | 26 ++------------------------ src/prolog/heap_print.rs | 23 ++++++++++++++++++++++- src/prolog/io.rs | 23 +++++++++++++++++++++++ src/prolog/lib/builtins.pl | 18 +++++++++--------- src/prolog/macros.rs | 3 +++ src/prolog/parser | 2 +- 6 files changed, 60 insertions(+), 35 deletions(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 30d5ac54..1b85a388 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -166,7 +166,8 @@ pub fn default_op_dir() -> OpDir { op_dir.insert((clause_name!(":-"), Fixity::In), (XFX, 1200, module_name.clone())); op_dir.insert((clause_name!(":-"), Fixity::Pre), (FX, 1200, module_name.clone())); - op_dir.insert((clause_name!("?-"), Fixity::Pre), (FX, 1200, module_name.clone())); + op_dir.insert((clause_name!("?-"), Fixity::Pre), (FX, 1200, module_name.clone())); + op_dir.insert((clause_name!(","), Fixity::In), (XFY, 1000, module_name.clone())); op_dir } @@ -548,29 +549,6 @@ impl Constant { } } -impl fmt::Display for Constant { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - 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()) - }, - &Constant::Char(c) => - write!(f, "'{}'", c as u8), - &Constant::EmptyList => - write!(f, "[]"), - &Constant::Number(ref n) => - write!(f, "{}", n), - &Constant::String(ref s) => - write!(f, "\"{}\"", s), - &Constant::Usize(integer) => - write!(f, "u{}", integer) - } - } -} - #[derive(PartialEq, Eq, Clone)] pub enum Term { AnonVar, diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index 2ee4bf0a..721a9cce 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -229,6 +229,27 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter> }) } + fn print_constant(&mut self, c: Constant) { + match c { + Constant::Char(c) if c == '\n' => + self.outputter.append("'\\n'"), +// Constant::Char(c) if c == '\f' => +// self.outputter.append("\\f"), + Constant::Char(c) if c == '\r' => + self.outputter.append("'\\r'"), + Constant::Char(c) if c == '\t' => + self.outputter.append("'\\t'"), +// Constant::Char(c) if c == '\b' => +// self.outputter.append("\\b"), +// Constant::Char(c) if c == '\\a' => +// self.outputter.append("\a"), +// Constant::Char(c) if c == '\\v' => +// self.outputter.append("\\v"), + _ => + self.outputter.append(format!("{}", c).as_str()) + } + } + fn handle_heap_term(&mut self, iter: &mut HCPreOrderIterator) { let heap_val = match self.check_for_seen(iter) { @@ -246,7 +267,7 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter> self.outputter.append("[]"); }, HeapCellValue::Addr(Addr::Con(c)) => - self.outputter.append(format!("{}", c).as_str()), + self.print_constant(c), HeapCellValue::Addr(Addr::Lis(_)) => { let cell = Rc::new(Cell::new(true)); diff --git a/src/prolog/io.rs b/src/prolog/io.rs index 70965751..5a55b0f1 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -18,6 +18,29 @@ impl fmt::Display for IndexPtr { } } +impl fmt::Display for Constant { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + 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()) + }, + &Constant::Char(c) => + write!(f, "'{}'", c as u8), + &Constant::EmptyList => + write!(f, "[]"), + &Constant::Number(ref n) => + write!(f, "{}", n), + &Constant::String(ref s) => + write!(f, "\"{}\"", s), + &Constant::Usize(integer) => + write!(f, "u{}", integer) + } + } +} + impl fmt::Display for ClauseName { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.as_str()) diff --git a/src/prolog/lib/builtins.pl b/src/prolog/lib/builtins.pl index a53664b7..58dccdd5 100644 --- a/src/prolog/lib/builtins.pl +++ b/src/prolog/lib/builtins.pl @@ -7,6 +7,15 @@ (\==)/2, (@=<)/2, (@>=)/2, (@<)/2, (@>)/2, (=@=)/2, (\=@=)/2, catch/3, throw/1, true/0, false/0]). +','(G1, G2) :- '$get_cp'(B), ','(G1, G2, B). + +','(!, ','(G1, G2), B) :- '$set_cp'(B), ','(G1, G2, B). +','(!, !, B) :- '$set_cp'(B). +','(!, G, B) :- '$set_cp'(B), G. +','(G, ','(G2, G3), B) :- !, G, ','(G2, G3, B). +','(G, !, B) :- !, G, '$set_cp'(B). +','(G1, G2, _) :- G1, G2. + % arithmetic operators. :- op(700, xfx, is). :- op(500, yfx, +). @@ -63,15 +72,6 @@ false :- '$fail'. % control operators. -','(G1, G2) :- '$get_cp'(B), ','(G1, G2, B). - -','(!, ','(G1, G2), B) :- '$set_cp'(B), ','(G1, G2, B). -','(!, !, B) :- '$set_cp'(B). -','(!, G, B) :- '$set_cp'(B), G. -','(G, ','(G2, G3), B) :- !, G, ','(G2, G3, B). -','(G, !, B) :- !, G, '$set_cp'(B). -','(G1, G2, _) :- G1, G2. - ;(G1, G2) :- '$get_cp'(B), ;(G1, G2, B). ;(G1, G4, B) :- compound(G1), G1 = ->(G2, G3), (G2 -> G3 ; '$set_cp'(B), G4). diff --git a/src/prolog/macros.rs b/src/prolog/macros.rs index ec289eca..0da939d3 100644 --- a/src/prolog/macros.rs +++ b/src/prolog/macros.rs @@ -1,4 +1,7 @@ macro_rules! clause_name { + ($name: expr, $tbl: expr) => ( + ClauseName::User(TabledRc::new($name, $tbl.clone())) + ) ; ($name: expr) => ( ClauseName::BuiltIn($name) ) diff --git a/src/prolog/parser b/src/prolog/parser index d52da58a..52034e3a 160000 --- a/src/prolog/parser +++ b/src/prolog/parser @@ -1 +1 @@ -Subproject commit d52da58a5d5c3404305466a53c2682ef84274085 +Subproject commit 52034e3a66b694fd16b164c509c525aeaf28470a -- 2.54.0