From e1ec4bee75fcde0c93076e8f6e1329a755de4e40 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 1 Feb 2021 16:50:05 -0700 Subject: [PATCH] move term expansion logic entirely into loader.pl --- src/loader.pl | 66 +++++++++++++++++++++++++++------- src/machine/loader.rs | 2 +- src/machine/mod.rs | 9 ----- src/term_and_goal_expansion.pl | 44 ----------------------- 4 files changed, 55 insertions(+), 66 deletions(-) delete mode 100644 src/term_and_goal_expansion.pl diff --git a/src/loader.pl b/src/loader.pl index 2a472ebf..d0b24f37 100644 --- a/src/loader.pl +++ b/src/loader.pl @@ -17,6 +17,51 @@ :- use_module(library(pairs)). +'$print_message_and_fail'(Error, Culprit) :- +% writeq(error(Error, Culprit)), +% nl, + '$fail'. + +expand_term(Term, ExpandedTerm) :- + ( catch(user:term_expansion(Term, ExpandedTerm0), + E, + loader:'$print_message_and_fail'(E, user:term_expansion)) -> + ( var(ExpandedTerm0) -> + error:instantiation_error(term_expansion/2) + ; ExpandedTerm0 = [_|_] -> + term_expansion_list(ExpandedTerm0, ExpandedTerm, []) + ; expand_term(ExpandedTerm0, ExpandedTerm) % term_expansion(ExpandedTerm0, ExpandedTerm) + ) + ; Term = ExpandedTerm + ). + + +term_expansion_list([], ExpandedTerms, ExpandedTerms). +term_expansion_list([Term|Terms], ExpandedTermsHead, ExpandedTermsTail) :- + expand_term(Term, ExpandedTerm0), % term_expansion(Term, ExpandedTerm0), + ( var(ExpandedTerm0) -> + error:instantiation_error(term_expansion/2) + ; ExpandedTerm0 = [_|_] -> + term_expansion_list(ExpandedTerm0, ExpandedTermsHead, ExpandedTerms0Tail), + term_expansion_list(Terms, ExpandedTerms0Tail, ExpandedTermsTail) + ; ExpandedTermsHead = [ExpandedTerm0 | ExpandedTerms0Tail], + term_expansion_list(Terms, ExpandedTerms0Tail, ExpandedTermsTail) + ). + + +goal_expansion(Goal, Module, ExpandedGoal) :- + ( catch(Module:goal_expansion(Goal, ExpandedGoal0), + E, + loader:'$print_message_and_fail'(E, Module:goal_expansion)) -> + ( var(ExpandedGoal0) -> + error:instantiation_error(goal_expansion/2) + ; goal_expansion(ExpandedGoal0, Module, ExpandedGoal) + ) + ; Goal = ExpandedGoal + ). + + + create_file_load_context(Stream, Path, Evacuable) :- '$push_load_context'(Stream, Path), '$push_load_state_payload'(Evacuable). @@ -132,10 +177,6 @@ expand_terms_and_goals(Term, Terms) :- ). -expand_term(UnexpandedTerm, ExpandedTerm) :- - user:term_expansion(UnexpandedTerm, ExpandedTerm). - - compile_dispatch_or_clause_on_list([], Evacuable, VNs). compile_dispatch_or_clause_on_list([Term | Terms], Evacuable, VNs) :- compile_dispatch_or_clause(Term, Evacuable, VNs), @@ -158,13 +199,13 @@ compile_dispatch((:- Declaration), Evacuable, _VNs) :- compile_declaration(Declaration, Evacuable) ). compile_dispatch(term_expansion(Term, Terms), Evacuable, VNs) :- - '$add_term_expansion_clause'('$term_expansion'(Term, Terms), Evacuable, VNs). + '$add_term_expansion_clause'(term_expansion(Term, Terms), Evacuable, VNs). compile_dispatch((term_expansion(Term, Terms) :- Body), Evacuable, VNs) :- - '$add_term_expansion_clause'(('$term_expansion'(Term, Terms) :- Body), Evacuable, VNs). + '$add_term_expansion_clause'((term_expansion(Term, Terms) :- Body), Evacuable, VNs). compile_dispatch(user:term_expansion(Term, Terms), Evacuable, VNs) :- - '$add_term_expansion_clause'('$term_expansion'(Term, Terms), Evacuable, VNs). + '$add_term_expansion_clause'(term_expansion(Term, Terms), Evacuable, VNs). compile_dispatch((user:term_expansion(Term, Terms) :- Body), Evacuable, VNs) :- - '$add_term_expansion_clause'(('$term_expansion'(Term, Terms) :- Body), Evacuable, VNs). + '$add_term_expansion_clause'((term_expansion(Term, Terms) :- Body), Evacuable, VNs). compile_dispatch(goal_expansion(Term, Terms), Evacuable, VNs) :- prolog_load_context(module, Target), '$add_goal_expansion_clause'(Target, goal_expansion(Term, Terms), Evacuable, VNs). @@ -263,6 +304,7 @@ load_context_path(Module, Path) :- Module = Path ). + use_module(Module, Exports, Evacuable) :- ( var(Module) -> instantiation_error(load/1) @@ -334,9 +376,9 @@ strip_module(Goal, M, G) :- expand_subgoal(UnexpandedGoals, MS, Module, ExpandedGoals, HeadVars) :- ( var(UnexpandedGoals) -> UnexpandedGoals = ExpandedGoals - ; user:goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1), + ; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1), ( Module \== user -> - user:goal_expansion(UnexpandedGoals1, user, Goals) + goal_expansion(UnexpandedGoals1, user, Goals) ; Goals = UnexpandedGoals1 ), ( inner_meta_specs(MS, Goals, _, MetaSpecs) -> @@ -393,9 +435,9 @@ expand_goal(UnexpandedGoals, Module, ExpandedGoals) :- expand_goal(UnexpandedGoals, Module, ExpandedGoals, HeadVars) :- ( var(UnexpandedGoals) -> UnexpandedGoals = ExpandedGoals - ; user:goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1), + ; goal_expansion(UnexpandedGoals, Module, UnexpandedGoals1), ( Module \== user -> - user:goal_expansion(UnexpandedGoals1, user, Goals) + goal_expansion(UnexpandedGoals1, user, Goals) ; Goals = UnexpandedGoals1 ), ( Goals = (Goal0, Goals0) -> diff --git a/src/machine/loader.rs b/src/machine/loader.rs index 88b023e7..4560b682 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -1045,7 +1045,7 @@ impl Machine { let term = loader.read_term_from_heap(temp_v!(1))?; loader.incremental_compile_clause( - (clause_name!("$term_expansion"), 2), + (clause_name!("term_expansion"), 2), term, CompilationTarget::User, false, diff --git a/src/machine/mod.rs b/src/machine/mod.rs index 9fc72720..a2486380 100644 --- a/src/machine/mod.rs +++ b/src/machine/mod.rs @@ -345,15 +345,6 @@ impl Machine { lib_path.pop(); // remove the "lib" at the end - bootstrapping_compile( - Stream::from(include_str!("../term_and_goal_expansion.pl")), - &mut wam, - ListingSource::from_file_and_path( - clause_name!("term_and_goal_expansion.pl"), - lib_path.clone(), - ), - ).unwrap(); - bootstrapping_compile( Stream::from(include_str!("../loader.pl")), &mut wam, diff --git a/src/term_and_goal_expansion.pl b/src/term_and_goal_expansion.pl deleted file mode 100644 index c02bbc94..00000000 --- a/src/term_and_goal_expansion.pl +++ /dev/null @@ -1,44 +0,0 @@ -% Unsure how to handle the printing of exceptions from term & goal expansion. - -'$print_message_and_fail'(Error, Culprit) :- -% writeq(error(Error, Culprit)), -% nl, - '$fail'. - -term_expansion(Term, ExpandedTerm) :- - ( catch(user:'$term_expansion'(Term, ExpandedTerm0), - E, - user:'$print_message_and_fail'(E, user:term_expansion)) -> - ( var(ExpandedTerm0) -> - error:instantiation_error(term_expansion/2) - ; ExpandedTerm0 = [_|_] -> - term_expansion_list(ExpandedTerm0, ExpandedTerm, []) - ; term_expansion(ExpandedTerm0, ExpandedTerm) - ) - ; Term = ExpandedTerm - ). - - -term_expansion_list([], ExpandedTerms, ExpandedTerms). -term_expansion_list([Term|Terms], ExpandedTermsHead, ExpandedTermsTail) :- - term_expansion(Term, ExpandedTerm0), - ( var(ExpandedTerm0) -> - error:instantiation_error(term_expansion/2) - ; ExpandedTerm0 = [_|_] -> - term_expansion_list(ExpandedTerm0, ExpandedTermsHead, ExpandedTerms0Tail), - term_expansion_list(Terms, ExpandedTerms0Tail, ExpandedTermsTail) - ; ExpandedTermsHead = [ExpandedTerm0 | ExpandedTerms0Tail], - term_expansion_list(Terms, ExpandedTerms0Tail, ExpandedTermsTail) - ). - - -goal_expansion(Goal, Module, ExpandedGoal) :- - ( catch(Module:goal_expansion(Goal, ExpandedGoal0), - E, - user:'$print_message_and_fail'(E, Module:goal_expansion)) -> - ( var(ExpandedGoal0) -> - error:instantiation_error(goal_expansion/2) - ; goal_expansion(ExpandedGoal0, Module, ExpandedGoal) - ) - ; Goal = ExpandedGoal - ). -- 2.54.0