]> Repositorios git - scryer-prolog.git/commitdiff
add support for quoted atoms to writeq
authorMark Thom <[email protected]>
Sun, 15 Jul 2018 23:54:37 +0000 (17:54 -0600)
committerMark Thom <[email protected]>
Sun, 15 Jul 2018 23:54:37 +0000 (17:54 -0600)
src/prolog/ast.rs
src/prolog/io.rs
src/prolog/machine/machine_state.rs
src/prolog/mod.rs
src/prolog/parser
src/tests.rs

index 51b6cce71f7eeb64ed560ba47fdc625da091c27f..f60639bc3c9f3f604adf1c119beac82c5373d355 100644 (file)
@@ -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),
index 7f346b45f7247fa243f664600936cd6aed7477fb..d162bc952e78f5624ff0f2b17b357145289a3b5e 100644 (file)
@@ -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) =>
index 8e1a9a0449dd5aaaa8a9cb7fe12414233d385733..825700996fe63e230b34c81856cd4c8522076cb3 100644 (file)
@@ -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());
index 511a1f86fbff4bddf7a40584f7c43f653022ce11..e6209c326a2e84d1c5bc81d33c8d2ae758290846 100644 (file)
@@ -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;
index a7b81b591bce10f93a5f835336c588be763516c6..6a7545257bbfc660b37a0bc3d7a72edb244dda86 160000 (submodule)
@@ -1 +1 @@
-Subproject commit a7b81b591bce10f93a5f835336c588be763516c6
+Subproject commit 6a7545257bbfc660b37a0bc3d7a72edb244dda86
index 0cd3d0328f8c097432a7ce34bf862b4e044ae2b2..8f1eff71912077a7ad16fa677853946d28a41015 100644 (file)
@@ -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"]]);