summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--arith.c30
-rw-r--r--eval.c6
-rw-r--r--lib.h6
-rw-r--r--txr.132
5 files changed, 84 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index dc9fa90c..ca96b0de 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2014-11-20 Kaz Kylheku <kaz@kylheku.com>
+ * arith.c (succ, ssucc, sssucc, pred, ppred, pppred): New functions.
+
+ * eval.c (eval_init): Register new functions as intrinsics.
+
+ * lib.h (succ, ssucc, sssucc, pred, ppred, pppred): Declared.
+
+ * txr.1: Documented.
+
+2014-11-20 Kaz Kylheku <kaz@kylheku.com>
+
* lib.c (where): Argument order reversed, with compat support.
* lib.h (where): Declaration updated.
diff --git a/arith.c b/arith.c
index 5d4cdada..23cf66a8 100644
--- a/arith.c
+++ b/arith.c
@@ -1011,6 +1011,36 @@ val oddp(val num)
}
}
+val succ(val num)
+{
+ return plus(num, one);
+}
+
+val ssucc(val num)
+{
+ return plus(num, two);
+}
+
+val sssucc(val num)
+{
+ return plus(num, three);
+}
+
+val pred(val num)
+{
+ return minus(num, one);
+}
+
+val ppred(val num)
+{
+ return minus(num, two);
+}
+
+val pppred(val num)
+{
+ return minus(num, three);
+}
+
val gt(val anum, val bnum)
{
tail:
diff --git a/eval.c b/eval.c
index dea40264..ab11ebef 100644
--- a/eval.c
+++ b/eval.c
@@ -3709,6 +3709,12 @@ void eval_init(void)
reg_fun(intern(lit("zerop"), user_package), func_n1(zerop));
reg_fun(intern(lit("evenp"), user_package), func_n1(evenp));
reg_fun(intern(lit("oddp"), user_package), func_n1(oddp));
+ reg_fun(intern(lit("succ"), user_package), func_n1(succ));
+ reg_fun(intern(lit("ssucc"), user_package), func_n1(ssucc));
+ reg_fun(intern(lit("sssucc"), user_package), func_n1(sssucc));
+ reg_fun(intern(lit("pred"), user_package), func_n1(pred));
+ reg_fun(intern(lit("ppred"), user_package), func_n1(ppred));
+ reg_fun(intern(lit("pppred"), user_package), func_n1(pppred));
reg_fun(intern(lit(">"), user_package), func_n1v(gtv));
reg_fun(intern(lit("<"), user_package), func_n1v(ltv));
reg_fun(intern(lit(">="), user_package), func_n1v(gev));
diff --git a/lib.h b/lib.h
index c4c2d5ff..80a56c14 100644
--- a/lib.h
+++ b/lib.h
@@ -542,6 +542,12 @@ val divi(val anum, val bnum);
val zerop(val num);
val evenp(val num);
val oddp(val num);
+val succ(val num);
+val ssucc(val num);
+val sssucc(val num);
+val pred(val num);
+val ppred(val num);
+val pppred(val num);
val gt(val anum, val bnum);
val lt(val anum, val bnum);
val ge(val anum, val bnum);
diff --git a/txr.1 b/txr.1
index 001f7b00..fd1e1822 100644
--- a/txr.1
+++ b/txr.1
@@ -18434,6 +18434,38 @@ is not divisible by two (odd), otherwise
it returns
.codn nil .
+.coNP Functions @, succ @, ssucc @, sssucc @, pred @, ppred @ and pppred
+.synb
+.mets (succ << number )
+.mets (ssucc << number )
+.mets (sssucc << number )
+.mets (pred << number )
+.mets (ppred << number )
+.mets (pppred << number )
+.syne
+.desc
+The
+.code succ
+function adds 1 to its argument and returns the resulting value.
+If the argument is an integer, then the return value is the successor
+of that integer, and if it is a character, then the return value
+is the successor of that character according to Unicode.
+
+The
+.code pred
+function subtracts 1 from its argument, and under similar considerations
+as above, the result represents the predecessor.
+
+The
+.code ssucc
+and
+.code sssucc
+functions add 2 and 3, respectively. Similarly,
+.code ppred
+and
+.code pppred
+subtract 2 and 3 from their argument.
+
.coNP Functions @, > @, < @, >= @ <= and @ =
.synb
.mets (> < number << number *)