PutToAttributedVarList,
#[strum_discriminants(strum(props(Arity = "3", Name = "$del_from_attr_list")))]
DeleteFromAttributedVarList,
- #[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes")))]
- DeleteAllAttributes,
+ #[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes_from_var")))]
+ DeleteAllAttributesFromVar,
REPL(REPLCodePtr),
}
&Instruction::CallGetFromAttributedVarList(_) |
&Instruction::CallPutToAttributedVarList(_) |
&Instruction::CallDeleteFromAttributedVarList(_) |
- &Instruction::CallDeleteAllAttributes(_) |
+ &Instruction::CallDeleteAllAttributesFromVar(_) |
&Instruction::CallFetchGlobalVar(_) |
&Instruction::CallFirstStream(_) |
&Instruction::CallFlushOutput(_) |
&Instruction::ExecuteGetFromAttributedVarList(_) |
&Instruction::ExecutePutToAttributedVarList(_) |
&Instruction::ExecuteDeleteFromAttributedVarList(_) |
- &Instruction::ExecuteDeleteAllAttributes(_) |
+ &Instruction::ExecuteDeleteAllAttributesFromVar(_) |
&Instruction::ExecuteFetchGlobalVar(_) |
&Instruction::ExecuteFirstStream(_) |
&Instruction::ExecuteFlushOutput(_) |
self.delete_from_attributed_variable_list();
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
}
- &Instruction::CallDeleteAllAttributes(_) => {
- self.delete_all_attributes();
+ &Instruction::CallDeleteAllAttributesFromVar(_) => {
+ self.delete_all_attributes_from_var();
self.machine_st.p += 1;
}
- &Instruction::ExecuteDeleteAllAttributes(_) => {
- self.delete_all_attributes();
+ &Instruction::ExecuteDeleteAllAttributesFromVar(_) => {
+ self.delete_all_attributes_from_var();
self.machine_st.p = self.machine_st.cp;
}
}
:- module('$project_atts', [copy_term/3]).
:- use_module(library(dcgs)).
+:- use_module(library(error), [can_be/2]).
:- use_module(library(lambda)).
-:- use_module(library(lists), [foldl/4]).
+:- use_module(library(lists), [foldl/4, maplist/2]).
project_attributes(QueryVars, AttrVars) :-
phrase(gather_attr_modules(AttrVars), Modules0),
foldl(V+\M^phrase(M:attribute_goals(V)), Modules),
gather_residual_goals(Vs).
-delete_all_attributes(Term) :- '$delete_all_attributes'(Term).
+delete_all_attributes_from_var(V) :- '$delete_all_attributes_from_var'(V).
copy_term(Term, Copy, Gs) :-
- '$term_attributed_variables'(Term, Vs),
- findall(Term-Gs,
- ( phrase(gather_residual_goals(Vs), Gs),
- delete_all_attributes(Term)
- ),
- [Copy-Gs]).
+ can_be(list, Gs),
+ findall(Term-Rs, term_residual_goals(Term,Rs), [Copy-Gs]).
+
+term_residual_goals(Term,Rs) :-
+ '$term_attributed_variables'(Term, Vs),
+ phrase(gather_residual_goals(Vs), Rs),
+ maplist(delete_all_attributes_from_var, Vs).
impl Machine {
#[inline(always)]
- pub(crate) fn delete_all_attributes(&mut self) {
- let h = self.machine_st.heap.len();
-
- self.machine_st.heap.push(heap_loc_as_cell!(h));
- self.machine_st.registers[2] = heap_loc_as_cell!(h);
-
- self.term_attributed_variables();
-
- let mut list_of_attr_vars = self.deref_register(2);
-
- while let HeapCellValueTag::Lis = list_of_attr_vars.get_tag() {
- let attr_var_loc = list_of_attr_vars.get_value();
+ pub(crate) fn delete_all_attributes_from_var(&mut self) {
+ let attr_var = self.deref_register(1);
+ if let HeapCellValueTag::AttrVar = attr_var.get_tag() {
+ let attr_var_loc = attr_var.get_value();
self.machine_st.heap[attr_var_loc] = heap_loc_as_cell!(attr_var_loc);
self.machine_st.trail(TrailRef::Ref(Ref::attr_var(attr_var_loc)));
-
- list_of_attr_vars = self.machine_st.heap[attr_var_loc + 1];
}
}