add '$unattributed_var' builtin (#1758)
This commit is contained in:
@@ -574,6 +574,8 @@ enum SystemClauseType {
|
|||||||
DeleteFromAttributedVarList,
|
DeleteFromAttributedVarList,
|
||||||
#[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes_from_var")))]
|
#[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes_from_var")))]
|
||||||
DeleteAllAttributesFromVar,
|
DeleteAllAttributesFromVar,
|
||||||
|
#[strum_discriminants(strum(props(Arity = "1", Name = "$unattributed_var")))]
|
||||||
|
UnattributedVar,
|
||||||
REPL(REPLCodePtr),
|
REPL(REPLCodePtr),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1621,7 +1623,7 @@ fn generate_instruction_preface() -> TokenStream {
|
|||||||
&Instruction::CallMakeDirectoryPath(_) |
|
&Instruction::CallMakeDirectoryPath(_) |
|
||||||
&Instruction::CallDeleteFile(_) |
|
&Instruction::CallDeleteFile(_) |
|
||||||
&Instruction::CallRenameFile(_) |
|
&Instruction::CallRenameFile(_) |
|
||||||
&Instruction::CallFileCopy(_) |
|
&Instruction::CallFileCopy(_) |
|
||||||
&Instruction::CallWorkingDirectory(_) |
|
&Instruction::CallWorkingDirectory(_) |
|
||||||
&Instruction::CallDeleteDirectory(_) |
|
&Instruction::CallDeleteDirectory(_) |
|
||||||
&Instruction::CallPathCanonical(_) |
|
&Instruction::CallPathCanonical(_) |
|
||||||
@@ -1636,6 +1638,7 @@ fn generate_instruction_preface() -> TokenStream {
|
|||||||
&Instruction::CallPutToAttributedVarList(_) |
|
&Instruction::CallPutToAttributedVarList(_) |
|
||||||
&Instruction::CallDeleteFromAttributedVarList(_) |
|
&Instruction::CallDeleteFromAttributedVarList(_) |
|
||||||
&Instruction::CallDeleteAllAttributesFromVar(_) |
|
&Instruction::CallDeleteAllAttributesFromVar(_) |
|
||||||
|
&Instruction::CallUnattributedVar(_) |
|
||||||
&Instruction::CallFetchGlobalVar(_) |
|
&Instruction::CallFetchGlobalVar(_) |
|
||||||
&Instruction::CallFirstStream(_) |
|
&Instruction::CallFirstStream(_) |
|
||||||
&Instruction::CallFlushOutput(_) |
|
&Instruction::CallFlushOutput(_) |
|
||||||
@@ -1855,6 +1858,7 @@ fn generate_instruction_preface() -> TokenStream {
|
|||||||
&Instruction::ExecutePutToAttributedVarList(_) |
|
&Instruction::ExecutePutToAttributedVarList(_) |
|
||||||
&Instruction::ExecuteDeleteFromAttributedVarList(_) |
|
&Instruction::ExecuteDeleteFromAttributedVarList(_) |
|
||||||
&Instruction::ExecuteDeleteAllAttributesFromVar(_) |
|
&Instruction::ExecuteDeleteAllAttributesFromVar(_) |
|
||||||
|
&Instruction::ExecuteUnattributedVar(_) |
|
||||||
&Instruction::ExecuteFetchGlobalVar(_) |
|
&Instruction::ExecuteFetchGlobalVar(_) |
|
||||||
&Instruction::ExecuteFirstStream(_) |
|
&Instruction::ExecuteFirstStream(_) |
|
||||||
&Instruction::ExecuteFlushOutput(_) |
|
&Instruction::ExecuteFlushOutput(_) |
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ length(_, N) :-
|
|||||||
|
|
||||||
length_rundown(Xs, 0) :- !, Xs = [].
|
length_rundown(Xs, 0) :- !, Xs = [].
|
||||||
length_rundown(Vs, N) :-
|
length_rundown(Vs, N) :-
|
||||||
\+ \+ '$project_atts':copy_term(Vs,Vs,[]), % unconstrained
|
'$unattributed_var'(Vs), % unconstrained
|
||||||
!,
|
!,
|
||||||
'$det_length_rundown'(Vs, N).
|
'$det_length_rundown'(Vs, N).
|
||||||
length_rundown([_|Xs], N) :- % force unification
|
length_rundown([_|Xs], N) :- % force unification
|
||||||
@@ -100,7 +100,7 @@ length_rundown([_|Xs], N) :- % force unification
|
|||||||
length(Xs, N1). % maybe some new info on Xs
|
length(Xs, N1). % maybe some new info on Xs
|
||||||
|
|
||||||
failingvarskip(Xs) :-
|
failingvarskip(Xs) :-
|
||||||
\+ \+ '$project_atts':copy_term(Xs,Xs,[]), % unconstrained
|
'$unattributed_var'(Xs), % unconstrained
|
||||||
!.
|
!.
|
||||||
failingvarskip([_|Xs0]) :- % force unification
|
failingvarskip([_|Xs0]) :- % force unification
|
||||||
'$skip_max_list'(_, _, Xs0,Xs),
|
'$skip_max_list'(_, _, Xs0,Xs),
|
||||||
|
|||||||
@@ -5239,6 +5239,14 @@ impl Machine {
|
|||||||
self.delete_all_attributes_from_var();
|
self.delete_all_attributes_from_var();
|
||||||
self.machine_st.p = self.machine_st.cp;
|
self.machine_st.p = self.machine_st.cp;
|
||||||
}
|
}
|
||||||
|
&Instruction::CallUnattributedVar(_) => {
|
||||||
|
self.machine_st.unattributed_var();
|
||||||
|
step_or_fail!(self, self.machine_st.p += 1);
|
||||||
|
}
|
||||||
|
&Instruction::ExecuteUnattributedVar(_) => {
|
||||||
|
self.machine_st.unattributed_var();
|
||||||
|
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -471,6 +471,25 @@ struct AttrListMatch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl MachineState {
|
impl MachineState {
|
||||||
|
#[inline(always)]
|
||||||
|
pub(crate) fn unattributed_var(&mut self) {
|
||||||
|
let attr_var = self.store(self.deref(self.registers[1]));
|
||||||
|
|
||||||
|
if !attr_var.is_var() {
|
||||||
|
self.fail = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
read_heap_cell!(attr_var,
|
||||||
|
(HeapCellValueTag::AttrVar, h) => {
|
||||||
|
let list_cell = self.store(self.deref(self.heap[h+1]));
|
||||||
|
self.fail = list_cell.get_tag() == HeapCellValueTag::Lis;
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn get_attr_var_list(&mut self, attr_var: HeapCellValue) -> Option<usize> {
|
pub(crate) fn get_attr_var_list(&mut self, attr_var: HeapCellValue) -> Option<usize> {
|
||||||
read_heap_cell!(attr_var,
|
read_heap_cell!(attr_var,
|
||||||
(HeapCellValueTag::AttrVar, h) => {
|
(HeapCellValueTag::AttrVar, h) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user