Enhanced the implementation

The restriction has been removed by using read_library_path from
cfd15f4e02.
This commit is contained in:
notoria
2020-07-01 13:14:12 +02:00
parent 83268f5ff6
commit bf13700a95
5 changed files with 41 additions and 24 deletions

View File

@@ -8,12 +8,12 @@
op(1150, fx, table) op(1150, fx, table)
]). ]).
:- use_module(library('tabling/double_linked_list')). :- use_module(library(tabling/double_linked_list)).
:- use_module(library('tabling/table_data_structure')). :- use_module(library(tabling/table_data_structure)).
:- use_module(library('tabling/batched_worklist')). :- use_module(library(tabling/batched_worklist)).
:- use_module(library('tabling/wrapper')). :- use_module(library(tabling/wrapper)).
:- use_module(library('tabling/global_worklist')). :- use_module(library(tabling/global_worklist)).
:- use_module(library('tabling/table_link_manager')). :- use_module(library(tabling/table_link_manager)).
:- use_module(library(cont)). :- use_module(library(cont)).
:- use_module(library(lists)). :- use_module(library(lists)).

View File

@@ -45,8 +45,8 @@
wkl_worklist_work_done/1 % +WorkList wkl_worklist_work_done/1 % +WorkList
]). ]).
:- use_module(library('tabling/global_worklist')). :- use_module(library(tabling/global_worklist)).
:- use_module(library('tabling/double_linked_list')). :- use_module(library(tabling/double_linked_list)).
:- use_module(library(atts)). :- use_module(library(atts)).
:- use_module(library(lists)). :- use_module(library(lists)).

View File

@@ -15,8 +15,8 @@
get_nb_identifiers/3 % +Table, -NbWorklistID, -NbAnswerTreeID get_nb_identifiers/3 % +Table, -NbWorklistID, -NbAnswerTreeID
]). ]).
:- use_module(library('tabling/table_link_manager')). :- use_module(library(tabling/table_link_manager)).
:- use_module(library('tabling/trie')). :- use_module(library(tabling/trie)).
/* Part of SWI-Prolog /* Part of SWI-Prolog
@@ -53,7 +53,7 @@
POSSIBILITY OF SUCH DAMAGE. POSSIBILITY OF SUCH DAMAGE.
*/ */
:- use_module(library('tabling/batched_worklist')). :- use_module(library(tabling/batched_worklist)).
:- use_module(library(atts)). :- use_module(library(atts)).
:- use_module(library(gensym)). :- use_module(library(gensym)).

View File

@@ -47,7 +47,7 @@
:- use_module(library(iso_ext)). :- use_module(library(iso_ext)).
:- use_module(library(terms)). :- use_module(library(terms)).
:- use_module(library('tabling/trie')). :- use_module(library(tabling/trie)).
:- attribute trie_table_link/1. :- attribute trie_table_link/1.

View File

@@ -340,16 +340,37 @@ fn setup_module_decl(
} }
} }
fn setup_use_module_decl(mut terms: Vec<Box<Term>>) -> Result<ModuleSource, ParserError> { fn read_library_path(
term: Term,
atom_tbl: TabledData<Atom>,
) -> Option<ClauseName> {
match term {
Term::Constant(_, Constant::Atom(atom, _)) => {
Some(atom.defrock_brackets())
}
_ => {
let mut atoms = vec![];
for term in unfold_by_str(term, "/") {
match term {
Term::Constant(_, Constant::Atom(atom, _)) => {
atoms.push(atom.as_str().to_owned());
}
_ => return None,
}
}
Some(clause_name!(atoms.join("/"), atom_tbl))
}
}
}
fn setup_use_module_decl(mut terms: Vec<Box<Term>>, atom_tbl: TabledData<Atom>) -> Result<ModuleSource, ParserError> {
match *terms.pop().unwrap() { match *terms.pop().unwrap() {
Term::Clause(_, ref name, ref mut terms, None) Term::Clause(_, ref name, ref mut terms, None)
if name.as_str() == "library" && terms.len() == 1 => if name.as_str() == "library" && terms.len() == 1 =>
{ {
terms read_library_path(*terms.pop().unwrap(), atom_tbl)
.pop()
.unwrap()
.to_constant()
.and_then(|c| c.to_atom())
.map(|c| ModuleSource::Library(c)) .map(|c| ModuleSource::Library(c))
.ok_or(ParserError::InvalidUseModuleDecl) .ok_or(ParserError::InvalidUseModuleDecl)
} }
@@ -396,11 +417,7 @@ fn setup_qualified_import(
Term::Clause(_, ref name, ref mut terms, None) Term::Clause(_, ref name, ref mut terms, None)
if name.as_str() == "library" && terms.len() == 1 => if name.as_str() == "library" && terms.len() == 1 =>
{ {
terms read_library_path(*terms.pop().unwrap(), atom_tbl.clone())
.pop()
.unwrap()
.to_constant()
.and_then(|c| c.to_atom())
.map(|c| ModuleSource::Library(c)) .map(|c| ModuleSource::Library(c))
.ok_or(ParserError::InvalidUseModuleDecl) .ok_or(ParserError::InvalidUseModuleDecl)
} }
@@ -685,7 +702,7 @@ fn setup_declaration<'a, 'b, 'c>(
} }
} }
("use_module", 1) => { ("use_module", 1) => {
Ok(Declaration::UseModule(setup_use_module_decl(terms)?)) Ok(Declaration::UseModule(setup_use_module_decl(terms, indices.atom_tbl())?))
} }
("use_module", 2) => { ("use_module", 2) => {
let (name, exports) = setup_qualified_import(terms, indices.atom_tbl())?; let (name, exports) = setup_qualified_import(terms, indices.atom_tbl())?;