diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2011-12-12 17:42:58 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2011-12-12 17:42:58 -0800 |
commit | 81f71cdbf8446246837665cc6f13e3da95a7db58 (patch) | |
tree | 3a0078cd114335bf413511089e2db17309878f70 /lib.c | |
parent | 1c31934c8294fec086bcfcd43479a3a399234ff7 (diff) | |
download | txr-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.c | 19 |
1 files changed, 18 insertions, 1 deletions
@@ -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); |