From: Mark Thom Date: Sun, 19 Mar 2023 05:08:09 +0000 (-0600) Subject: add '$unattributed_var' builtin (#1758) X-Git-Tag: v0.9.2~162 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=4ee6a7bfb828474cbcab51695f24b120b1e35314;p=scryer-prolog.git add '$unattributed_var' builtin (#1758) --- diff --git a/build/instructions_template.rs b/build/instructions_template.rs index d2cee3bb..93615dec 100644 --- a/build/instructions_template.rs +++ b/build/instructions_template.rs @@ -574,6 +574,8 @@ enum SystemClauseType { DeleteFromAttributedVarList, #[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes_from_var")))] DeleteAllAttributesFromVar, + #[strum_discriminants(strum(props(Arity = "1", Name = "$unattributed_var")))] + UnattributedVar, REPL(REPLCodePtr), } @@ -1621,7 +1623,7 @@ fn generate_instruction_preface() -> TokenStream { &Instruction::CallMakeDirectoryPath(_) | &Instruction::CallDeleteFile(_) | &Instruction::CallRenameFile(_) | - &Instruction::CallFileCopy(_) | + &Instruction::CallFileCopy(_) | &Instruction::CallWorkingDirectory(_) | &Instruction::CallDeleteDirectory(_) | &Instruction::CallPathCanonical(_) | @@ -1636,6 +1638,7 @@ fn generate_instruction_preface() -> TokenStream { &Instruction::CallPutToAttributedVarList(_) | &Instruction::CallDeleteFromAttributedVarList(_) | &Instruction::CallDeleteAllAttributesFromVar(_) | + &Instruction::CallUnattributedVar(_) | &Instruction::CallFetchGlobalVar(_) | &Instruction::CallFirstStream(_) | &Instruction::CallFlushOutput(_) | @@ -1855,6 +1858,7 @@ fn generate_instruction_preface() -> TokenStream { &Instruction::ExecutePutToAttributedVarList(_) | &Instruction::ExecuteDeleteFromAttributedVarList(_) | &Instruction::ExecuteDeleteAllAttributesFromVar(_) | + &Instruction::ExecuteUnattributedVar(_) | &Instruction::ExecuteFetchGlobalVar(_) | &Instruction::ExecuteFirstStream(_) | &Instruction::ExecuteFlushOutput(_) | diff --git a/src/lib/lists.pl b/src/lib/lists.pl index 792c2be2..92bc202d 100644 --- a/src/lib/lists.pl +++ b/src/lib/lists.pl @@ -92,7 +92,7 @@ length(_, N) :- length_rundown(Xs, 0) :- !, Xs = []. length_rundown(Vs, N) :- - \+ \+ '$project_atts':copy_term(Vs,Vs,[]), % unconstrained + '$unattributed_var'(Vs), % unconstrained !, '$det_length_rundown'(Vs, N). 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 failingvarskip(Xs) :- - \+ \+ '$project_atts':copy_term(Xs,Xs,[]), % unconstrained + '$unattributed_var'(Xs), % unconstrained !. failingvarskip([_|Xs0]) :- % force unification '$skip_max_list'(_, _, Xs0,Xs), diff --git a/src/machine/dispatch.rs b/src/machine/dispatch.rs index e2e144c5..39ca74c6 100644 --- a/src/machine/dispatch.rs +++ b/src/machine/dispatch.rs @@ -5239,6 +5239,14 @@ impl Machine { self.delete_all_attributes_from_var(); 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); + } } } diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 39311276..a84b78c7 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -471,6 +471,25 @@ struct AttrListMatch { } 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 { read_heap_cell!(attr_var, (HeapCellValueTag::AttrVar, h) => {