:- op(1199, fx, attribute).
+% represent the list of attributes belonging to a variable,
+% of a particular module, as a list of terms of the form
+% Module:put_atts(V, ListOfAtts).
+'$default_attr_list'(Module, V, ListOfAtts) :-
+ Module:get_atts(V, Attributes),
+ '$default_attr_list'(Attributes, Module, V, ListOfAtts).
+
+'$default_attr_list'([PG | PGs], Module, AttrVar, [Module:put_atts(AttrVar, PG) | Gs]) :-
+ '$default_attr_list'(PGs, Module, AttrVar, Gs).
+'$default_attr_list'([], _, _, []).
+
'$absent_attr'(V, Attr) :-
'$get_attr_list'(V, Ls),
'$absent_from_list'(Ls, Attr).
self.machine_st.attr_var_init.project_attrs_loc = self.code_repo.code.len();
self.code_repo.code.extend(code.into_iter());
}
- Err(_) => panic!("Machine::compile_special_forms() failed at PROJECT_ATTRS"),
+ Err(e) => panic!("Machine::compile_special_forms() failed at PROJECT_ATTRS: {}", e),
}
}
call_goals([AttrVar|AttrVars], Module) :-
( catch(Module:attribute_goals(AttrVar, Goal),
error(evaluation_error((Module:attribute_goals)/2), attribute_goals/2),
- true),
+ atts:'$default_attr_list'(Module, AttrVar, Goal)),
nonvar(Goal) -> enqueue_goal(Goal)
; true
),