YAP 7.1.0
expand_macros.yap
Go to the documentation of this file.
1/**
2 * @file expand_macros.yap
3 * @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan>
4 * @date Tue Nov 17 15:16:12 2015
5 *
6 * @brief utilities that perform macro expansion for maplist/2 and
7 * friends.
8 *
9 *
10*/
11
12%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13%%
14%% preprocessing for meta-calls
15%%
16%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17
18
19:- module( expand_macros,
20 [compile_aux/2,
21 pred_name/4,
22 transformation_id/1,
23 allowed_expansion/1,
24 allowed_module/2] ).
25
26
27:- append/3use_module(library(lists), []).
28:- format_to_chars/3read_from_chars/2use_module(library(charsio), [, ]).
29:- must_be/2use_module(library(error), []).
30:- sub_term/2use_module(library(occurs), []).
31
32:- multifile allowed_module/2.
33
34:- dynamic number_of_expansions/1.
35
36number_of_expansions(0).
37
38
39
40%%%%%%%%%%%%%%%%%%%%
41% utilities
42%%%%%%%%%%%%%%%%%%%%
43
44compile_aux([Clause|Clauses], Module) :-
45 % compile the predicate declaration if needed
46 (
47 Clause = (Head :- _)
48 ;
49 Clause = Head
50 ),
51 ,
52 functor(Head, F, N),
53 ( current_predicate(Module:F/N)
54 ->
55 current_predicate
56 ;
57 % format'*** Creating auxiliary predicate ~q~n', [F/N]),
58 % checklist(portray_clause, [Clause|Clauses]),
59 compile_term([Clause|Clauses], Module)
60 ).
61
62compile_term([], _).
63compile_term([Clause|Clauses], Module) :-
64 assert_static(Module:Clause),
65 compile_term(Clauses, Module).
66
67append_args(Term, Args, NewTerm) :-
68 Term =.. [Meta|OldArgs],
69 append(OldArgs, Args, GoalArgs),
70 NewTerm =.. [Meta|GoalArgs].
71
72aux_preds(Module:Meta, MetaVars, Pred, PredVars, Proto, _, OModule) :- aux_preds,
73 aux_preds(Meta, MetaVars, Pred, PredVars, Proto, Module, OModule).
74aux_preds(Meta, MetaVars, Pred, PredVars, Proto, Module, Module) :-
75 Meta =.. [F|Args],
76 aux_args(Args, MetaVars, PredArgs, PredVars, ProtoArgs),
77 Pred =.. [F|PredArgs],
78 Proto =.. [F|ProtoArgs].
79
80aux_args([], [], [], [], []).
81aux_args([Arg|Args], MVars, [Arg|PArgs], PVars, [Arg|ProtoArgs]) :-
82 ground(Arg), ground,
83 aux_args(Args, MVars, PArgs, PVars, ProtoArgs).
84aux_args([Arg|Args], [Arg|MVars], [PVar|PArgs], [PVar|PVars], ['_'|ProtoArgs]) :-
85 aux_args(Args, MVars, PArgs, PVars, ProtoArgs).
86
87pred_name(Macro, Arity, _ , Name) :-
88 transformation_id(Id),
89
90 atomic_concat(['$$$__Auxiliary_predicate__ for',Macro,'/',Arity,' ',Id], Name).
91
92transformation_id(Id) :-
93 retract(number_of_expansions(Id)),
94 Id1 is Id+1,
95 assert(number_of_expansions(Id1)).
96
97
98harmless_dcgexception(instantiation_error). % ex: phrase(([1],x:X,[3]),L)
99harmless_dcgexception(type_error(callable,_)). % ex: phrase(27,L)
100
101
102allowed_expansion(QExpand) :-
103 strip_module(QExpand, Mod, Pred),
104 goal_expansion_allowed(Pred, Mod).
105
106goal_expansion_allowed(Pred, Mod) :-
107 allowed_module(Pred,Mod),
108 once( prolog_load_context(_, _) ), % make sure we are compiling.
109
110
111
112
113allowed_module(checklist(_,_),expand_macros).
114allowed_module(checklist(_,_),apply_macros).
115allowed_module(checklist(_,_),maplist).
116allowed_module(maplist(_,_),expand_macros).
117allowed_module(maplist(_,_),apply_macros).
118allowed_module(maplist(_,_),maplist).
119allowed_module(maplist(_,_,_),expand_macros).
120allowed_module(maplist(_,_,_),apply_macros).
121allowed_module(maplist(_,_,_),maplist).
122allowed_module(maplist(_,_,_,_),expand_macros).
123allowed_module(maplist(_,_,_,_),apply_macros).
124allowed_module(maplist(_,_,_,_),maplist).
125allowed_module(maplist(_,_,_,_,_),expand_macros).
126allowed_module(maplist(_,_,_,_,_),apply_macros).
127allowed_module(maplist(_,_,_,_,_),maplist).
128allowed_module(maplist(_,_,_,_,_,_),expand_macros).
129allowed_module(maplist(_,_,_,_,_,_),apply_macros).
130allowed_module(maplist(_,_,_,_,_,_),maplist).
131allowed_module(selectlist(_,_,_),expand_macros).
132allowed_module(selectlist(_,_,_),apply_macros).
133allowed_module(selectlist(_,_,_),maplist).
134allowed_module(include(_,_,_),expand_macros).
135allowed_module(include(_,_,_),apply_macros).
136allowed_module(include(_,_,_),maplist).
137allowed_module(exclude(_,_,_),expand_macros).
138allowed_module(exclude(_,_,_),apply_macros).
139allowed_module(exclude(_,_,_),maplist).
140allowed_module(partition(_,_,_,_),expand_macros).
141allowed_module(partition(_,_,_,_),apply_macros).
142allowed_module(partition(_,_,_,_),maplist).
143allowed_module(partition(_,_,_,_,_),expand_macros).
144allowed_module(partition(_,_,_,_,_),apply_macros).
145allowed_module(partition(_,_,_,_,_),maplist).
146allowed_module(convlist(_,_,_),expand_macros).
147allowed_module(convlist(_,_,_),apply_macros).
148allowed_module(convlist(_,_,_),maplist).
149allowed_module(sumlist(_,_,_,_),expand_macros).
150allowed_module(sumlist(_,_,_,_),apply_macros).
151allowed_module(sumlist(_,_,_,_),maplist).
152allowed_module(mapargs(_,_,_),expand_macros).
153allowed_module(mapargs(_,_,_),apply_macros).
154allowed_module(mapargs(_,_,_),maplist).
155allowed_module(sumargs(_,_,_,_),expand_macros).
156allowed_module(sumargs(_,_,_,_),apply_macros).
157allowed_module(sumargs(_,_,_,_),maplist).
158allowed_module(mapnodes(_,_,_),expand_macros).
159allowed_module(mapnodes(_,_,_),apply_macros).
160allowed_module(mapnodes(_,_,_),maplist).
161allowed_module(checknodes(_,_),expand_macros).
162allowed_module(checknodes(_,_),apply_macros).
163allowed_module(checknodes(_,_),maplist).
164allowed_module(sumnodes(_,_,_,_),expand_macros).
165allowed_module(sumnodes(_,_,_,_),apply_macros).
166allowed_module(sumnodes(_,_,_,_),maplist).
assert_static(: C)
current_predicate( F )
assert(+ C)
retract(+ C)
use_module( +Files )
once( 0:G)
ground( T)
functor( T, F, N)
format_to_chars(+ Form, + Args, - Result)
read_from_chars( + Chars, - Term)
append(? List1,? List2,? List3)