27:-system_module(attributes,
31 del_all_module_atts/2,
34 modules_with_attributes/1],
35 [
unify_attributed_variable/2,
38:-
dynamic attributes:existing_attribute/4.
39:-
dynamic attributes:modules_with_attributes/1.
40:-
dynamic attributes:attributed_module/3.
43 attributes:attributed_module/3.
45:-
dynamic existing_attribute/4.
46:-
dynamic modules_with_attributes/1.
47:-
dynamic attributed_module/3.
73 attvars_residuals(
NVs,
Gs, []),
74 delete_attributes(
NVs)
77attvars_residuals([])
--> [].
78attvars_residuals([
V|Vs])
-->
80 attvars_residuals(
Vs).
81attvars_residuals([
V|Vs])
-->
83 attvar_residuals(
As,
V),
85 attvars_residuals(
Vs).
86attvars_residuals([
_|Vs])
-->
87 attvars_residuals(
Vs).
94attvar_residuals(
_ ,
V)
-->
98attvar_residuals([] ,
_V)
--> attvar_residuals.
99attvar_residuals(att(
Module,
_Value,
As),
V)
-->
100 {
'$pred_exists'(attribute_goals(
V,
_,
_),
Module) },
101 call(
Module:attribute_goals(
V )),
103 attvar_residuals(
As,
V).
104 attvar_residuals(att(
_,
_Value,
As),
V)
-->
105 attvar_residuals(
As,
V).
107attvar_residuals(
Attribute,
V)
-->
108 {
functor(
Attribute,
Module,
Ar),
113 '$pred_exists'(attribute_goal(
V,
Goal),
Module),
114 call(
Module:attribute_goal(
V,
Goal))
121 {
arg(
1,
Attribute,
As) },
122 attvar_residuals(
As,
V).
123attvar_residuals(
_,
_)
--> [].
137:unify_attributed_variable(
V,
New)
:-
144 '$undefined'(woken_att_do(
V,
New,
LGoals,
DoNotBind), attributes)
149 :woken_att_do(
V,
New,
LGoals,
DoNotBind)
155 unbind_attvar
:bind_attvar(
V)
161 do_hook_attributes(
Atts2,
New)
163 do_hook_attributes(
Atts1,
New)
168lcall
:unify_attributed_variable(
V,
B)
:-
169 (
\+ attvar(
V)
; '$att_bound'(
V) ),
172 (
attvar(
B),
\+ '$att_bound'(
B) )
174 prolog
:unify_attributed_variable(
B,
V)
178prolog
:unify_attributed_variable(
V,
New)
:-
179 unify_attributed_variable
:get_attrs(
V,
SWIAtts),
181 '$undefined'(woken_att_do(
V,
New,
LGoals,
DoNotBind), attributes)
186 :woken_att_do(
V,
New,
LGoals,
DoNotBind)
192 unbind_attvar
:bind_attvar(
V)
195 do_hook_attributes(
SWIAtts,
New),
198do_hook_attributes([],
_)
:- do_hook_attributes.
199do_hook_attributes(
Att0,
Binding)
:-
200 Att0=att(
Mod,
Att,
Atts),
201 '$pred_exists'(attr_unify_hook(
Att0,
Binding),
Mod),
203 call(
Mod:attr_unify_hook(
Att,
Binding)),
204 do_hook_attributes(
Atts,
Binding).
205do_hook_attributes(att(
_,
_,
Atts),
Binding)
:-
206 do_hook_attributes(
Atts,
Binding).
210lcall([
Mod:Gls|Goals])
:-
215lcall2([
Goal|Goals],
Mod)
:-
238 call_residue_vars
:all_attvars(
Vs0),
240 call
:all_attvars(
Vs),
245 '$ord_remove'(
Vss,
Vs0s,
Residue).
247'$ord_remove'([],
_, []).
248'$ord_remove'([
V|Vs], [], [
V|Vs]).
249'$ord_remove'([
V1|Vss], [
V2|Vs0s],
Residue)
:-
251 '$ord_remove'(
Vss,
Vs0s,
Residue)
254 Residue = [
V1|ResidueF],
255 '$ord_remove'(
Vss, [
V2|Vs0s],
ResidueF)
257 '$ord_remove'([
V1|Vss],
Vs0s,
Residue)
278attributes
:module_has_attributes(
Mod)
:-
279 module_has_attributes
:attributed_module(
Mod,
_,
_),
attributed_module.
283list([
L|Ls])
--> [
L],
list(
Ls).
285dot_list((
A,
B))
--> dot_list,
dot_list(
A),
dot_list(
B).
288delete_attributes(
Term)
:-
290 delete_attributes_(
Vs).
292delete_attributes_([]).
293delete_attributes_([
V|Vs])
:-
295 delete_attributes_(
Vs).
330 '$do_error'(instantiation_error,call_residue(
Goal,
Residue)).
333 call_residue(
Goal,
Module,
Residue).
335 '$current_module'(
Module),
336 call_residue(
Goal,
Module,
Residue).
338call_residue(
Goal,
Module,
Residue)
:-
340 run_project_attributes(
NewAttVars,
Module:Goal),
343copy_term
:delayed_goals(
G,
Vs,
NVs,
Gs)
:-
344 project_delayed_goals(
G),
348project_delayed_goals(
G)
:-
353 project_delayed_goals
:all_attvars(
LAV),
355 run_project_attributes(
LAV,
G),
run_project_attributes.
356project_delayed_goals(
_).
364att_vars([
V|LGs], [
V|AttVars])
:- attvar(
V),
attvar,
365 att_vars(
LGs,
AttVars).
366att_vars([
_|LGs],
AttVars)
:-
367 att_vars(
LGs,
AttVars).
392run_project_attributes(
AllVs,
G)
:-
393 findall(
Mod,current_predicate(project_attributes,
Mod:project_attributes(
AttIVs,
AllVs)),
Mods),
395 pick_att_vars(
InputVs,
AttIVs),
396 project_module(
Mods,
AttIVs,
AllVs).
399pick_att_vars([
V|L],[
V|NL])
:- attvar(
V),
attvar,
401pick_att_vars([
_|L],
NL)
:-
404project_module([],
_LIV,
_LAV).
405project_module([
Mod|LMods],
LIV,
LAV)
:-
406 call(
Mod:project_attributes(
LIV,
LAV)),
call,
407 call
:all_attvars(
NLAV),
408 project_module(
LMods,
LIV,
NLAV).
409project_module([
_|LMods],
LIV,
LAV)
:-
410 project_module(
LMods,
LIV,
LAV).
413
call_residue_vars(: G, L)
copy_term(? TI,- TF,- Goals)
get_attrs(+ Var,- Attributes)
term_attvars(+ Term,- AttVars)
term_variables(? Term, - Variables)
attr_unify_hook(+ AttValue,+ VarValue)