improve matching on partial strings as lists
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "scryer-prolog"
|
name = "scryer-prolog"
|
||||||
version = "0.8.77"
|
version = "0.8.78"
|
||||||
authors = ["Mark Thom <markjordanthom@gmail.com>"]
|
authors = ["Mark Thom <markjordanthom@gmail.com>"]
|
||||||
repository = "https://github.com/mthom/scryer-prolog"
|
repository = "https://github.com/mthom/scryer-prolog"
|
||||||
description = "A modern Prolog implementation written mostly in Rust."
|
description = "A modern Prolog implementation written mostly in Rust."
|
||||||
|
|||||||
@@ -58,8 +58,13 @@ impl CodeOffsets {
|
|||||||
let is_initial_index = self.lists.is_empty();
|
let is_initial_index = self.lists.is_empty();
|
||||||
self.lists.push(Self::add_index(is_initial_index, index));
|
self.lists.push(Self::add_index(is_initial_index, index));
|
||||||
},
|
},
|
||||||
&Term::Constant(_, Constant::String(_))
|
&Term::Constant(_, Constant::String(ref s))
|
||||||
if !self.flags.double_quotes.is_atom() => { // strings are lists in this case.
|
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();
|
let is_initial_index = self.lists.is_empty();
|
||||||
self.lists.push(Self::add_index(is_initial_index, index));
|
self.lists.push(Self::add_index(is_initial_index, index));
|
||||||
},
|
},
|
||||||
@@ -132,7 +137,7 @@ impl CodeOffsets {
|
|||||||
_ => IntIndex::Fail
|
_ => IntIndex::Fail
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn switch_on_constant(con_ind: HashMap<Constant, ThirdLevelIndex>, prelude: &mut CodeDeque)
|
fn switch_on_constant(con_ind: HashMap<Constant, ThirdLevelIndex>, prelude: &mut CodeDeque)
|
||||||
-> IntIndex
|
-> IntIndex
|
||||||
{
|
{
|
||||||
@@ -203,7 +208,7 @@ impl CodeOffsets {
|
|||||||
match con_loc {
|
match con_loc {
|
||||||
IntIndex::External(offset) => offset + prelude_len + 1,
|
IntIndex::External(offset) => offset + prelude_len + 1,
|
||||||
IntIndex::Fail => 0,
|
IntIndex::Fail => 0,
|
||||||
IntIndex::Internal(offset) => offset,
|
IntIndex::Internal(offset) => offset,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +221,7 @@ impl CodeOffsets {
|
|||||||
IntIndex::Internal(_) => prelude_len - lst_offset + 1
|
IntIndex::Internal(_) => prelude_len - lst_offset + 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_indices(self, code: &mut Code, mut code_body: Code)
|
pub fn add_indices(self, code: &mut Code, mut code_body: Code)
|
||||||
{
|
{
|
||||||
if self.no_indices() {
|
if self.no_indices() {
|
||||||
|
|||||||
@@ -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 mut indices = default_index_store!(wam.indices.atom_tbl.clone());
|
||||||
let wam_indices = &mut wam.indices;
|
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)
|
Ok(indices)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1496,7 +1496,8 @@ impl MachineState {
|
|||||||
|
|
||||||
let offset = match addr {
|
let offset = match addr {
|
||||||
Addr::HeapCell(_) | Addr::StackCell(..) | Addr::AttrVar(..) => v,
|
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::Con(_) => c,
|
||||||
Addr::Lis(_) => l,
|
Addr::Lis(_) => l,
|
||||||
Addr::Str(_) => s,
|
Addr::Str(_) => s,
|
||||||
|
|||||||
Reference in New Issue
Block a user