From: Mark Thom Date: Wed, 1 May 2019 03:30:28 +0000 (-0600) Subject: improve matching on partial strings as lists X-Git-Tag: v0.8.110~70 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=b05cff30448b36841ee0277f34a120d00fb5b981;p=scryer-prolog.git improve matching on partial strings as lists --- diff --git a/Cargo.toml b/Cargo.toml index 7d570da4..7236e498 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scryer-prolog" -version = "0.8.77" +version = "0.8.78" authors = ["Mark Thom "] repository = "https://github.com/mthom/scryer-prolog" description = "A modern Prolog implementation written mostly in Rust." diff --git a/src/prolog/indexing.rs b/src/prolog/indexing.rs index 4cba9d13..81207a33 100644 --- a/src/prolog/indexing.rs +++ b/src/prolog/indexing.rs @@ -58,8 +58,13 @@ impl CodeOffsets { let is_initial_index = self.lists.is_empty(); self.lists.push(Self::add_index(is_initial_index, index)); }, - &Term::Constant(_, Constant::String(_)) - if !self.flags.double_quotes.is_atom() => { // strings are lists in this case. + &Term::Constant(_, Constant::String(ref s)) + if !self.flags.double_quotes.is_atom() && !s.is_empty() => { // strings are lists in this case. + let is_initial_index = self.lists.is_empty(); + self.lists.push(Self::add_index(is_initial_index, index)); + }, + &Term::Constant(_, Constant::String(ref s)) + if !self.flags.double_quotes.is_atom() && s.is_expandable() => { let is_initial_index = self.lists.is_empty(); self.lists.push(Self::add_index(is_initial_index, index)); }, @@ -132,7 +137,7 @@ impl CodeOffsets { _ => IntIndex::Fail } } - + fn switch_on_constant(con_ind: HashMap, prelude: &mut CodeDeque) -> IntIndex { @@ -203,7 +208,7 @@ impl CodeOffsets { match con_loc { IntIndex::External(offset) => offset + prelude_len + 1, IntIndex::Fail => 0, - IntIndex::Internal(offset) => offset, + IntIndex::Internal(offset) => offset, } } @@ -216,7 +221,7 @@ impl CodeOffsets { IntIndex::Internal(_) => prelude_len - lst_offset + 1 } } - + pub fn add_indices(self, code: &mut Code, mut code_body: Code) { if self.no_indices() { diff --git a/src/prolog/machine/compile.rs b/src/prolog/machine/compile.rs index ac60200a..8a0f4326 100644 --- a/src/prolog/machine/compile.rs +++ b/src/prolog/machine/compile.rs @@ -133,8 +133,8 @@ fn compile_decl(wam: &mut Machine, compiler: &mut ListingCompiler, decl: Declara let mut indices = default_index_store!(wam.indices.atom_tbl.clone()); let wam_indices = &mut wam.indices; - compiler.process_decl(decl, &mut wam.code_repo, wam_indices, &mut indices, flags)?; - + compiler.process_decl(decl, &mut wam.code_repo, wam_indices, &mut indices, flags)?; + Ok(indices) } diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index bab156b4..8bcfde78 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -1496,7 +1496,8 @@ impl MachineState { let offset = match addr { Addr::HeapCell(_) | Addr::StackCell(..) | Addr::AttrVar(..) => v, - Addr::Con(Constant::String(_)) if !self.flags.double_quotes.is_atom() => l, + Addr::Con(Constant::String(ref s)) if !self.flags.double_quotes.is_atom() => + if s.is_empty() && !s.is_expandable() { c } else { l }, Addr::Con(_) => c, Addr::Lis(_) => l, Addr::Str(_) => s,