From c02c88b6f09a22a318ce89137746d22efbacea4e Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 16 Apr 2018 22:00:30 -0600 Subject: [PATCH 1/3] add functional notation for operators. --- src/prolog/io.rs | 1 + src/prolog/parser | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/prolog/io.rs b/src/prolog/io.rs index 85e5330c..1b005bd3 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -679,6 +679,7 @@ pub fn compile_listing(wam: &mut Machine, src_str: &str) -> EvalSession .or_insert(CodeIndex::default()); index.0.set(IndexPtr::Index(p)); + index.1 = module_name; } decl_info.label_clauses(p, &mut code_dir, &mut decl_code); diff --git a/src/prolog/parser b/src/prolog/parser index 0e9dd3a0..1b3bcc77 160000 --- a/src/prolog/parser +++ b/src/prolog/parser @@ -1 +1 @@ -Subproject commit 0e9dd3a01f21c6457bd1bcb35518ccdb502c82bd +Subproject commit 1b3bcc77f2b9d264c9753653ae87bfa3b4c11081 From 35694e76220ab3c344be4044896381561ba32dfb Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 16 Apr 2018 23:25:37 -0600 Subject: [PATCH 2/3] print characters correctly --- src/prolog/ast.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 1128a800..bee15064 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -537,7 +537,7 @@ impl fmt::Display for Constant { &Constant::Atom(ref atom) => write!(f, "{}", atom), &Constant::Char(c) => - write!(f, "#\\{}", c), + write!(f, "{}", c as u8), &Constant::EmptyList => write!(f, "[]"), &Constant::Number(ref n) => From 56318b09d0ec092c161ecc319d234a338680f65f Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Tue, 17 Apr 2018 09:26:13 -0600 Subject: [PATCH 3/3] add predicate existence errors for failed metacalls. --- src/prolog/machine/machine_state.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index 049223f8..c76edba2 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -426,17 +426,16 @@ pub(crate) trait CallPolicy: Any { Ok(()) }, - &ClauseType::CallN => { + &ClauseType::CallN => if let Some((name, arity)) = machine_st.setup_call_n(arity) { if let Some(idx) = code_dirs.get(name.clone(), arity, &machine_st.p.clone()) { - return self.context_call(machine_st, name, arity, idx, lco); + self.context_call(machine_st, name, arity, idx, lco) } else { - machine_st.fail = true; + Err(predicate_existence_error(name, arity, machine_st.heap.h)) } - } - - Ok(()) - }, + } else { + Ok(()) + }, &ClauseType::Compare => { let a1 = machine_st[temp_v!(1)].clone(); let a2 = machine_st[temp_v!(2)].clone();