op(1150, fx, table)
]).
-:- use_module(library('tabling/double_linked_list')).
-:- use_module(library('tabling/table_data_structure')).
-:- use_module(library('tabling/batched_worklist')).
-:- use_module(library('tabling/wrapper')).
-:- use_module(library('tabling/global_worklist')).
-:- use_module(library('tabling/table_link_manager')).
+:- use_module(library(tabling/double_linked_list)).
+:- use_module(library(tabling/table_data_structure)).
+:- use_module(library(tabling/batched_worklist)).
+:- use_module(library(tabling/wrapper)).
+:- use_module(library(tabling/global_worklist)).
+:- use_module(library(tabling/table_link_manager)).
:- use_module(library(cont)).
:- use_module(library(lists)).
wkl_worklist_work_done/1 % +WorkList
]).
-:- use_module(library('tabling/global_worklist')).
-:- use_module(library('tabling/double_linked_list')).
+:- use_module(library(tabling/global_worklist)).
+:- use_module(library(tabling/double_linked_list)).
:- use_module(library(atts)).
:- use_module(library(lists)).
get_nb_identifiers/3 % +Table, -NbWorklistID, -NbAnswerTreeID
]).
-:- use_module(library('tabling/table_link_manager')).
-:- use_module(library('tabling/trie')).
+:- use_module(library(tabling/table_link_manager)).
+:- use_module(library(tabling/trie)).
/* Part of SWI-Prolog
POSSIBILITY OF SUCH DAMAGE.
*/
-:- use_module(library('tabling/batched_worklist')).
+:- use_module(library(tabling/batched_worklist)).
:- use_module(library(atts)).
:- use_module(library(gensym)).
}
}
-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() {
Term::Clause(_, ref name, ref mut terms, None)
if name.as_str() == "library" && terms.len() == 1 =>
{
- terms
- .pop()
- .unwrap()
- .to_constant()
- .and_then(|c| c.to_atom())
+ read_library_path(*terms.pop().unwrap(), atom_tbl)
.map(|c| ModuleSource::Library(c))
.ok_or(ParserError::InvalidUseModuleDecl)
}
Term::Clause(_, ref name, ref mut terms, None)
if name.as_str() == "library" && terms.len() == 1 =>
{
- terms
- .pop()
- .unwrap()
- .to_constant()
- .and_then(|c| c.to_atom())
+ read_library_path(*terms.pop().unwrap(), atom_tbl.clone())
.map(|c| ModuleSource::Library(c))
.ok_or(ParserError::InvalidUseModuleDecl)
}
}
}
("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) => {
let (name, exports) = setup_qualified_import(terms, indices.atom_tbl())?;