]> Repositorios git - scryer-prolog.git/commitdiff
Value::from_heapcell()
authorbakaq <[email protected]>
Sun, 11 Aug 2024 17:12:34 +0000 (14:12 -0300)
committerbakaq <[email protected]>
Thu, 15 Aug 2024 02:44:52 +0000 (23:44 -0300)
src/machine/lib_machine.rs
src/machine/parsed_results.rs

index dba599c88fcad71f199f855c7998925dc026a8b2..354e540d360f67a0cca633511aba979a253ea309 100644 (file)
@@ -1,8 +1,6 @@
 use std::collections::BTreeMap;
-use std::sync::Arc;
 
 use crate::atom_table;
-use crate::heap_print::{HCPrinter, HCValueOutputter, PrinterOutputter};
 use crate::machine::machine_indices::VarKey;
 use crate::machine::mock_wam::CompositeOpDir;
 use crate::machine::{BREAK_FROM_DISPATCH_LOOP_LOC, LIB_QUERY_SUCCESS};
@@ -96,32 +94,16 @@ impl Iterator for QueryState<'_> {
             if var_key.to_string().starts_with('_') {
                 continue;
             }
-            let mut printer = HCPrinter::new(
-                &mut machine.machine_st.heap,
-                Arc::clone(&machine.machine_st.atom_tbl),
-                &mut machine.machine_st.stack,
-                &machine.indices.op_dir,
-                PrinterOutputter::new(),
-                *term_to_be_printed,
-            );
-
-            printer.ignore_ops = false;
-            printer.numbervars = true;
-            printer.quoted = true;
-            printer.max_depth = 1000; // NOTE: set this to 0 for unbounded depth
-            printer.double_quotes = true;
-            printer.var_names.clone_from(var_names);
-
-            let outputter = printer.print();
-
-            let output: String = outputter.result();
-
-            if var_key.to_string() != output {
-                bindings.insert(
-                    var_key.to_string(),
-                    Value::try_from(output).expect("Couldn't convert Houtput to Value"),
-                );
+
+            let term = Value::from_heapcell(machine, term_to_be_printed, var_names);
+
+            if let Value::String(ref term_str) = term {
+                if *term_str == var_key.to_string() {
+                    continue;
+                }
             }
+
+            bindings.insert(var_key.to_string(), term);
         }
 
         // NOTE: there are outstanding choicepoints, backtrack
index 0dd8236f88c27aa3fea793833284f134f5eb4740..2fb6ea2472952eb17e5c785ceab0bca376c502cd 100644 (file)
@@ -1,11 +1,19 @@
 use crate::atom_table::*;
+use crate::heap_print::PrinterOutputter;
+use crate::heap_print::{HCPrinter, HCValueOutputter};
+use crate::parser::ast;
 use dashu::*;
+use indexmap::IndexMap;
 use ordered_float::OrderedFloat;
 use std::collections::BTreeMap;
 use std::collections::HashMap;
 use std::fmt::Display;
 use std::fmt::Write;
 use std::iter::FromIterator;
+use std::sync::Arc;
+
+use super::HeapCellValue;
+use super::Machine;
 
 pub type QueryResult = Result<QueryResolution, String>;
 
@@ -133,6 +141,35 @@ pub enum Value {
     Var,
 }
 
+impl Value {
+    pub(crate) fn from_heapcell(
+        machine: &mut Machine,
+        heap_cell: &HeapCellValue,
+        var_names: &IndexMap<HeapCellValue, ast::VarPtr>,
+    ) -> Self {
+        let mut printer = HCPrinter::new(
+            &mut machine.machine_st.heap,
+            Arc::clone(&machine.machine_st.atom_tbl),
+            &mut machine.machine_st.stack,
+            &machine.indices.op_dir,
+            PrinterOutputter::new(),
+            *heap_cell,
+        );
+
+        printer.ignore_ops = false;
+        printer.numbervars = true;
+        printer.quoted = true;
+        printer.max_depth = 1000; // NOTE: set this to 0 for unbounded depth
+        printer.double_quotes = true;
+        printer.var_names.clone_from(var_names);
+
+        let outputter = printer.print();
+
+        let output: String = outputter.result();
+        Value::try_from(output).expect("Couldn't convert Houtput to Value")
+    }
+}
+
 impl From<BTreeMap<&str, Value>> for QueryMatch {
     fn from(bindings: BTreeMap<&str, Value>) -> Self {
         QueryMatch {