From bf13700a9531b3991e047c44e5e06c12bd57c13c Mon Sep 17 00:00:00 2001 From: notoria Date: Wed, 1 Jul 2020 13:14:12 +0200 Subject: [PATCH] Enhanced the implementation The restriction has been removed by using read_library_path from cfd15f4e027b4df216e723bbd35facac28a09a1c. --- src/lib/tabling.pl | 12 ++++---- src/lib/tabling/batched_worklist.pl | 4 +-- src/lib/tabling/table_data_structure.pl | 6 ++-- src/lib/tabling/table_link_manager.pl | 2 +- src/machine/toplevel.rs | 41 +++++++++++++++++-------- 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/lib/tabling.pl b/src/lib/tabling.pl index dfe4c429..703da8e3 100644 --- a/src/lib/tabling.pl +++ b/src/lib/tabling.pl @@ -8,12 +8,12 @@ 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)). diff --git a/src/lib/tabling/batched_worklist.pl b/src/lib/tabling/batched_worklist.pl index 7cef4f13..f39f8422 100644 --- a/src/lib/tabling/batched_worklist.pl +++ b/src/lib/tabling/batched_worklist.pl @@ -45,8 +45,8 @@ 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)). diff --git a/src/lib/tabling/table_data_structure.pl b/src/lib/tabling/table_data_structure.pl index 107a7a00..0ce989da 100644 --- a/src/lib/tabling/table_data_structure.pl +++ b/src/lib/tabling/table_data_structure.pl @@ -15,8 +15,8 @@ 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 @@ -53,7 +53,7 @@ POSSIBILITY OF SUCH DAMAGE. */ -:- use_module(library('tabling/batched_worklist')). +:- use_module(library(tabling/batched_worklist)). :- use_module(library(atts)). :- use_module(library(gensym)). diff --git a/src/lib/tabling/table_link_manager.pl b/src/lib/tabling/table_link_manager.pl index 1195680c..ec88f105 100644 --- a/src/lib/tabling/table_link_manager.pl +++ b/src/lib/tabling/table_link_manager.pl @@ -47,7 +47,7 @@ :- use_module(library(iso_ext)). :- use_module(library(terms)). -:- use_module(library('tabling/trie')). +:- use_module(library(tabling/trie)). :- attribute trie_table_link/1. diff --git a/src/machine/toplevel.rs b/src/machine/toplevel.rs index 9937fffe..eaa17691 100644 --- a/src/machine/toplevel.rs +++ b/src/machine/toplevel.rs @@ -340,16 +340,37 @@ fn setup_module_decl( } } -fn setup_use_module_decl(mut terms: Vec>) -> Result { +fn read_library_path( + term: Term, + atom_tbl: TabledData, +) -> Option { + 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>, atom_tbl: TabledData) -> Result { 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) } @@ -396,11 +417,7 @@ fn setup_qualified_import( 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) } @@ -685,7 +702,7 @@ fn setup_declaration<'a, 'b, 'c>( } } ("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())?; -- 2.54.0