From a13b94622b512d9850c1cd10bc58577c428692d2 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 28 May 2018 20:19:52 -0600 Subject: [PATCH] print chars somewhat appropriately. --- src/prolog/ast.rs | 1 - src/prolog/heap_print.rs | 14 ++++++++++++-- src/prolog/lib/builtins.pl | 22 +++++++++++----------- src/prolog/parser | 2 +- src/tests.rs | 4 ++++ 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 1b85a388..7ba81748 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -167,7 +167,6 @@ 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::In), (XFY, 1000, module_name.clone())); op_dir } diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index 721a9cce..c8ca8a9d 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -46,6 +46,7 @@ pub trait HCValueOutputter { type Output; fn new() -> Self; + fn push_char(&mut self, char); fn append(&mut self, &str); fn begin_new_var(&mut self); fn result(self) -> Self::Output; @@ -69,6 +70,10 @@ impl HCValueOutputter for PrinterOutputter { self.contents += contents; } + fn push_char(&mut self, c: char) { + self.contents.push(c); + } + fn begin_new_var(&mut self) { if self.contents.len() != 0 { self.contents += ", "; @@ -233,12 +238,17 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter> 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 == '\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) => { + self.outputter.append("'"); + self.outputter.push_char(c); + self.outputter.append("'"); + }, // Constant::Char(c) if c == '\b' => // self.outputter.append("\\b"), // Constant::Char(c) if c == '\\a' => diff --git a/src/prolog/lib/builtins.pl b/src/prolog/lib/builtins.pl index 58dccdd5..35953a40 100644 --- a/src/prolog/lib/builtins.pl +++ b/src/prolog/lib/builtins.pl @@ -7,15 +7,6 @@ (\==)/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, +). @@ -72,6 +63,15 @@ 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). @@ -87,8 +87,8 @@ G1 -> G2 :- '$get_cp'(B), ->(G1, G2, B). % arg. -/* Here is the old, SWI Prolog-imitative arg/3. The new, ISO Prolog - * compliant arg/3 is implemented in Rust. +/* Here is the old, SWI Prolog-imitative arg/3. It has been superseded by an ISO Prolog + * compliant arg/3 implemented in Rust. arg(N, Functor, Arg) :- var(N), !, functor(Functor, _, Arity), arg_(N, 1, Arity, Functor, Arg). arg(N, Functor, Arg) :- integer(N), !, functor(Functor, _, Arity), '$get_arg'(N, Functor, Arg). diff --git a/src/prolog/parser b/src/prolog/parser index 52034e3a..25b42247 160000 --- a/src/prolog/parser +++ b/src/prolog/parser @@ -1 +1 @@ -Subproject commit 52034e3a66b694fd16b164c509c525aeaf28470a +Subproject commit 25b422477921de898dd50b0aa33be8fac5a0ec61 diff --git a/src/tests.rs b/src/tests.rs index 2581884a..ca6842b8 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -36,6 +36,10 @@ impl HCValueOutputter for TestOutputter { self.focus += focus; } + fn push_char(&mut self, c: char) { + self.focus.push(c); + } + fn begin_new_var(&mut self) { if !self.focus.is_empty() { let mut focus = String::new(); -- 2.54.0