From 37a906cf374e86397664a0c896a580a340e17bcb Mon Sep 17 00:00:00 2001 From: bakaq Date: Sun, 11 Aug 2024 14:12:34 -0300 Subject: [PATCH] Value::from_heapcell() --- src/machine/lib_machine.rs | 36 +++++++++------------------------- src/machine/parsed_results.rs | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/machine/lib_machine.rs b/src/machine/lib_machine.rs index dba599c8..354e540d 100644 --- a/src/machine/lib_machine.rs +++ b/src/machine/lib_machine.rs @@ -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 diff --git a/src/machine/parsed_results.rs b/src/machine/parsed_results.rs index 0dd8236f..2fb6ea24 100644 --- a/src/machine/parsed_results.rs +++ b/src/machine/parsed_results.rs @@ -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; @@ -133,6 +141,35 @@ pub enum Value { Var, } +impl Value { + pub(crate) fn from_heapcell( + machine: &mut Machine, + heap_cell: &HeapCellValue, + var_names: &IndexMap, + ) -> 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> for QueryMatch { fn from(bindings: BTreeMap<&str, Value>) -> Self { QueryMatch { -- 2.54.0