add write variants
This commit is contained in:
@@ -4,7 +4,6 @@ use prolog_parser::string_list::*;
|
||||
use prolog::instructions::*;
|
||||
use prolog::and_stack::*;
|
||||
use prolog::copier::*;
|
||||
use prolog::heap_print::*;
|
||||
use prolog::machine::IndexStore;
|
||||
use prolog::machine::machine_errors::*;
|
||||
use prolog::num::{BigInt, BigUint, Zero, One};
|
||||
@@ -541,14 +540,6 @@ pub(crate) trait CallPolicy: Any {
|
||||
|
||||
return_from_clause!(machine_st.last_call, machine_st)
|
||||
},
|
||||
&BuiltInClauseType::Writeq => {
|
||||
let output = machine_st.print_term(machine_st[temp_v!(1)].clone(),
|
||||
WriteqFormatter {},
|
||||
PrinterOutputter::new());
|
||||
|
||||
println!("{}", output.result());
|
||||
return_from_clause!(machine_st.last_call, machine_st)
|
||||
},
|
||||
&BuiltInClauseType::CopyTerm => {
|
||||
machine_st.duplicate_term();
|
||||
return_from_clause!(machine_st.last_call, machine_st)
|
||||
@@ -671,7 +662,7 @@ pub(crate) trait CallPolicy: Any {
|
||||
machine_st.execute_inlined(&inlined),
|
||||
ClauseType::Op(..) | ClauseType::Named(..) => {
|
||||
let module = name.owning_module();
|
||||
|
||||
|
||||
if let Some(idx) = indices.get_code_index((name.clone(), arity), module) {
|
||||
self.context_call(machine_st, name, arity, idx, indices)?;
|
||||
} else {
|
||||
|
||||
@@ -119,10 +119,10 @@ impl MachineState {
|
||||
}
|
||||
|
||||
pub(super)
|
||||
fn print_var_eq<Fmt, Outputter>(&self, var: Rc<Var>, addr: Addr, var_dir: &HeapVarDict,
|
||||
fmt: Fmt, mut output: Outputter)
|
||||
-> Outputter
|
||||
where Fmt: HCValueFormatter, Outputter: HCValueOutputter
|
||||
fn print_var_eq<Outputter>(&self, var: Rc<Var>, addr: Addr, var_dir: &HeapVarDict,
|
||||
mut output: Outputter)
|
||||
-> Outputter
|
||||
where Outputter: HCValueOutputter
|
||||
{
|
||||
let orig_len = output.len();
|
||||
|
||||
@@ -131,7 +131,9 @@ impl MachineState {
|
||||
output.append(var.as_str());
|
||||
output.append(" = ");
|
||||
|
||||
let printer = HCPrinter::from_heap_locs(&self, fmt, output, var_dir);
|
||||
let mut printer = HCPrinter::from_heap_locs(&self, output, var_dir);
|
||||
printer.numbervars = false;
|
||||
|
||||
let mut output = printer.print(addr);
|
||||
|
||||
let bad_ending = format!("= {}", &var);
|
||||
@@ -144,20 +146,11 @@ impl MachineState {
|
||||
}
|
||||
|
||||
pub(super)
|
||||
fn print_exception<Fmt, Outputter>(&self, addr: Addr, var_dir: &HeapVarDict,
|
||||
fmt: Fmt, output: Outputter)
|
||||
-> Outputter
|
||||
where Fmt: HCValueFormatter, Outputter: HCValueOutputter
|
||||
fn print_exception<Outputter>(&self, addr: Addr, var_dir: &HeapVarDict, output: Outputter)
|
||||
-> Outputter
|
||||
where Outputter: HCValueOutputter
|
||||
{
|
||||
let printer = HCPrinter::from_heap_locs(&self, fmt, output, var_dir);
|
||||
printer.print(addr)
|
||||
}
|
||||
|
||||
pub(super)
|
||||
fn print_term<Fmt, Outputter>(&self, addr: Addr, fmt: Fmt, output: Outputter) -> Outputter
|
||||
where Fmt: HCValueFormatter, Outputter: HCValueOutputter
|
||||
{
|
||||
let printer = HCPrinter::new(&self, fmt, output);
|
||||
let printer = HCPrinter::from_heap_locs(&self, output, var_dir);
|
||||
printer.print(addr)
|
||||
}
|
||||
|
||||
|
||||
@@ -348,7 +348,6 @@ impl Machine {
|
||||
|
||||
let error_str = self.machine_st.print_exception(Addr::HeapCell(h),
|
||||
&heap_locs,
|
||||
TermFormatter {},
|
||||
PrinterOutputter::new())
|
||||
.result();
|
||||
|
||||
@@ -401,9 +400,8 @@ impl Machine {
|
||||
let mut sorted_vars: Vec<(&Rc<Var>, &Addr)> = var_dir.iter().collect();
|
||||
sorted_vars.sort_by_key(|ref v| v.0);
|
||||
|
||||
for (var, addr) in sorted_vars {
|
||||
let fmt = TermFormatter {};
|
||||
output = self.machine_st.print_var_eq(var.clone(), addr.clone(), var_dir, fmt, output);
|
||||
for (var, addr) in sorted_vars {
|
||||
output = self.machine_st.print_var_eq(var.clone(), addr.clone(), var_dir, output);
|
||||
}
|
||||
|
||||
output
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
use prolog_parser::ast::*;
|
||||
|
||||
use prolog::heap_iter::*;
|
||||
use prolog::heap_print::*;
|
||||
use prolog::instructions::*;
|
||||
use prolog::machine::IndexStore;
|
||||
use prolog::machine::machine_errors::*;
|
||||
@@ -443,31 +444,31 @@ impl MachineState {
|
||||
&SystemClauseType::TermVariables => {
|
||||
let a1 = self[temp_v!(1)].clone();
|
||||
let mut vars = Vec::new();
|
||||
|
||||
|
||||
{
|
||||
let iter = HCPreOrderIterator::new(self, a1);
|
||||
|
||||
let iter = HCPreOrderIterator::new(self, a1);
|
||||
|
||||
for item in iter {
|
||||
match item {
|
||||
match item {
|
||||
HeapCellValue::Addr(Addr::HeapCell(h)) =>
|
||||
vars.push(Ref::HeapCell(h)),
|
||||
vars.push(Ref::HeapCell(h)),
|
||||
HeapCellValue::Addr(Addr::StackCell(fr, sc)) =>
|
||||
vars.push(Ref::StackCell(fr, sc)),
|
||||
vars.push(Ref::StackCell(fr, sc)),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let mut h = self.heap.h;
|
||||
let outcome = Addr::HeapCell(h);
|
||||
|
||||
let mut seen_vars = HashSet::new();
|
||||
|
||||
|
||||
for r in vars {
|
||||
if seen_vars.contains(&r) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
self.heap.push(HeapCellValue::Addr(Addr::Lis(h+1)));
|
||||
self.heap.push(HeapCellValue::Addr(r.as_addr()));
|
||||
|
||||
@@ -481,7 +482,31 @@ impl MachineState {
|
||||
let a2 = self[temp_v!(2)].clone();
|
||||
self.unify(a2, outcome);
|
||||
},
|
||||
&SystemClauseType::UnwindStack => self.unwind_stack()
|
||||
&SystemClauseType::UnwindStack => self.unwind_stack(),
|
||||
&SystemClauseType::WriteTerm => {
|
||||
let addr = self[temp_v!(1)].clone();
|
||||
|
||||
let ignore_ops = self[temp_v!(2)].clone();
|
||||
let numbervars = self[temp_v!(3)].clone();
|
||||
let quoted = self[temp_v!(4)].clone();
|
||||
|
||||
let mut printer = HCPrinter::new(&self, PrinterOutputter::new());
|
||||
|
||||
if let &Addr::Con(Constant::Atom(ref name, ..)) = &ignore_ops {
|
||||
printer.ignore_ops = name.as_str() == "true";
|
||||
}
|
||||
|
||||
if let &Addr::Con(Constant::Atom(ref name, ..)) = &numbervars {
|
||||
printer.numbervars = name.as_str() == "true";
|
||||
}
|
||||
|
||||
if let &Addr::Con(Constant::Atom(ref name, ..)) = "ed {
|
||||
printer.quoted = name.as_str() == "true";
|
||||
}
|
||||
|
||||
let mut output = printer.print(addr);
|
||||
println!("{}", output.result());
|
||||
}
|
||||
};
|
||||
|
||||
self.set_p();
|
||||
|
||||
@@ -124,9 +124,11 @@ impl MachineState {
|
||||
self.reset();
|
||||
Ok(None)
|
||||
} else {
|
||||
let mut output = self.print_term(Addr::HeapCell(h),
|
||||
WriteqFormatter {},
|
||||
PrinterOutputter::new());
|
||||
let mut output = {
|
||||
let mut printer = HCPrinter::new(&self, PrinterOutputter::new());
|
||||
printer.print(Addr::HeapCell(h))
|
||||
};
|
||||
|
||||
output.push_char('.');
|
||||
|
||||
self.reset();
|
||||
|
||||
Reference in New Issue
Block a user