]> Repositorios git - scryer-prolog.git/commitdiff
add arg
authorMark Thom <[email protected]>
Sat, 12 May 2018 07:21:31 +0000 (01:21 -0600)
committerMark Thom <[email protected]>
Sat, 12 May 2018 07:21:31 +0000 (01:21 -0600)
src/prolog/ast.rs
src/prolog/heap_print.rs
src/prolog/lib/builtins.pl
src/prolog/machine/machine_state.rs

index 4a7f747d312ea04c247ce4b5571fe55445a0cb34..f9ea9c0c517400f4971e933c40003e5d81428154 100644 (file)
@@ -1711,8 +1711,7 @@ impl Add<usize> 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),
         }
     }
 }
index e7f5ea48442d789864dee112c8a8d7cdfbc2dfd9..caa1b7b5598b7f3d14bc681d822951fda07e9a23 100644 (file)
@@ -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);
                 }
             }
index 92bcc6e6bda320bc7fdd48b78d5c5e2885dc22ab..a8fa00a07d6e43692199b9bcaa6c5c64dc7dfe74 100644 (file)
@@ -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).
index 59efdc471a0cf76d58077d7aa3d12cd27a65384e..5e0889b7da14ee8f9da72f42e7a6f7c2d8fca704 100644 (file)
@@ -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(())
             },