summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-12-12 17:42:58 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-12-12 17:42:58 -0800
commit81f71cdbf8446246837665cc6f13e3da95a7db58 (patch)
tree3a0078cd114335bf413511089e2db17309878f70 /lib.c
parent1c31934c8294fec086bcfcd43479a3a399234ff7 (diff)
downloadtxr-81f71cdbf8446246837665cc6f13e3da95a7db58.tar.gz
txr-81f71cdbf8446246837665cc6f13e3da95a7db58.tar.bz2
txr-81f71cdbf8446246837665cc6f13e3da95a7db58.zip
* arith.c (expt): New function.
* eval.c (eval_init): Registering new intrinsic functions, reduce-left, reduce-right and expt. * lib.c (minusv): Return one instead of num(1). (exptv, reduce_right): New functions. * lib.h (expt, exptv, reduce_right): Declared. * txr.1: Blank sections for new functions.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/lib.c b/lib.c
index 01f1569a..21cfb68c 100644
--- a/lib.c
+++ b/lib.c
@@ -851,7 +851,7 @@ val minusv(val minuend, val nlist)
val mulv(val nlist)
{
if (!nlist)
- return num(1);
+ return one;
else if (!cdr(nlist))
return car(nlist);
return reduce_left(func_n2(mul), cdr(nlist), car(nlist), nil);
@@ -933,6 +933,11 @@ val minv(val first, val rest)
return reduce_left(func_n2(min2), rest, first, nil);
}
+val exptv(val nlist)
+{
+ return reduce_right(func_n2(expt), nlist, one, nil);
+}
+
val string_own(wchar_t *str)
{
val obj = make_obj();
@@ -2073,6 +2078,18 @@ val reduce_left(val fun, val list, val init, val key)
return init;
}
+val reduce_right(val fun, val list, val init, val key)
+{
+ if (!key)
+ key = identity_f;
+
+ if (nullp(list))
+ return init;
+ return funcall2(fun, funcall1(key, car(list)),
+ if3(cdr(list), reduce_right(fun, cdr(list), init, key),
+ init));
+}
+
static val do_curry_12_2(val fcons, val arg2)
{
return funcall2(car(fcons), cdr(fcons), arg2);