From: Mark Thom Date: Sat, 12 May 2018 07:21:31 +0000 (-0600) Subject: add arg X-Git-Tag: v0.8.110~465^2~8 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=0951bcff583415789d9748955444d913ea322736;p=scryer-prolog.git add arg --- diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index 4a7f747d..f9ea9c0c 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -1711,8 +1711,7 @@ impl Add for CodePtr { fn add(self, rhs: usize) -> Self::Output { match self { CodePtr::Local(local) => CodePtr::Local(local + rhs), - CodePtr::CallN(_, local) | CodePtr::BuiltInClause(_, local) => - CodePtr::Local(local + rhs), + CodePtr::CallN(_, local) | CodePtr::BuiltInClause(_, local) => CodePtr::Local(local + rhs), } } } diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index e7f5ea48..caa1b7b5 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -120,19 +120,15 @@ impl HCValueFormatter for TermFormatter { match fixity { Fixity::Post => { state_stack.push(TokenOrRedirect::Atom(ct.name())); - state_stack.push(TokenOrRedirect::Space); state_stack.push(TokenOrRedirect::Redirect); }, Fixity::Pre => { state_stack.push(TokenOrRedirect::Redirect); - state_stack.push(TokenOrRedirect::Space); state_stack.push(TokenOrRedirect::Atom(ct.name())); }, Fixity::In => { state_stack.push(TokenOrRedirect::Redirect); - state_stack.push(TokenOrRedirect::Space); state_stack.push(TokenOrRedirect::Atom(ct.name())); - state_stack.push(TokenOrRedirect::Space); state_stack.push(TokenOrRedirect::Redirect); } } diff --git a/src/prolog/lib/builtins.pl b/src/prolog/lib/builtins.pl index 92bcc6e6..a8fa00a0 100644 --- a/src/prolog/lib/builtins.pl +++ b/src/prolog/lib/builtins.pl @@ -3,7 +3,7 @@ :- module(builtins, [(=)/2, (+)/2, (*)/2, (-)/2, (/)/2, (/\)/2, (\/)/2, (is)/2, (xor)/2, (div)/2, (//)/2, (rdiv)/2, (<<)/2, (>>)/2, (mod)/2, (rem)/2, (>)/2, (<)/2, (=\=)/2, (=:=)/2, - (-)/1, (>=)/2, (=<)/2, (->)/2, (;)/2, (==)/2, catch/3, + (-)/1, (>=)/2, (=<)/2, (->)/2, (;)/2, (==)/2, arg/3, catch/3, throw/1, true/0, false/0]). % arithmetic operators. @@ -86,3 +86,13 @@ handle_ball(Ball, C, R) :- Ball = C, !, '$erase_ball', call(R). handle_ball(_, _, _) :- '$unwind_stack'. throw(Ball) :- '$set_ball'(Ball), '$unwind_stack'. + +% arg. + +arg(N, Functor, Arg) :- var(N), !, functor(Functor, _, Arity), arg_(N, 1, Arity, Functor, Arg). +arg(N, Functor, Arg) :- integer(N), !, functor(Functor, _, Arity), '$get_arg'(N, Functor, Arg). +arg(N, Functor, Arg) :- throw(error(type_error(integer, N), arg/3)). + +arg_(N, N, N, Functor, Arg) :- !, '$get_arg'(N, Functor, Arg). +arg_(N, N, Arity, Functor, Arg) :- '$get_arg'(N, Functor, Arg). +arg_(N, N0, Arity, Functor, Arg) :- N0 < Arity, N1 is N0 + 1, arg_(N, N1, Arity, Functor, Arg). diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index 59efdc47..5e0889b7 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -511,7 +511,7 @@ pub(crate) trait CallPolicy: Any { let result = machine_st.arith_eval_by_metacall(temp_v!(2))?; machine_st.unify(a, Addr::Con(Constant::Number(result))); - machine_st.p += 1; + machine_st.p += 1; // TODO: change this!! Ok(()) },