summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorPaul A. Patience <paul@apatience.com>2022-01-22 03:19:07 -0500
committerKaz Kylheku <kaz@kylheku.com>2022-01-22 22:28:39 -0800
commit004e1208708fa7ed0538c391c42411e36ddac431 (patch)
tree499c8d691cd83f708590058ffdc0ba67514e8ecd /eval.c
parent912954cca7ed1d778a2ee7f416e0461845836c7c (diff)
downloadtxr-004e1208708fa7ed0538c391c42411e36ddac431.tar.gz
txr-004e1208708fa7ed0538c391c42411e36ddac431.tar.bz2
txr-004e1208708fa7ed0538c391c42411e36ddac431.zip
lib: new functions nand, nor, nandf and norf.
* eval.c (me_nand, me_nor, nor_fun, nand_fun): New functions. (eval_init): Register new intrinsics. * lib.c (nandv, norv): New functions. * lib.h (nandv, norv): Declared. * txr.1: Documented, along with trivial fixes to the descriptions of and, or, andf, orf and notf. * stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index a1c6b8b4..15936205 100644
--- a/eval.c
+++ b/eval.c
@@ -3279,6 +3279,18 @@ static val rt_pprof(val prof_list)
return retval;
}
+static val me_nand(val form, val menv)
+{
+ (void) menv;
+ return list(not_s, cons(and_s, cdr(form)), nao);
+}
+
+static val me_nor(val form, val menv)
+{
+ (void) menv;
+ return list(not_s, cons(or_s, cdr(form)), nao);
+}
+
static val me_when(val form, val menv)
{
(void) menv;
@@ -6356,6 +6368,11 @@ static val or_fun(struct args *vals)
return nil;
}
+static val nor_fun(struct args *vals)
+{
+ return tnil(!or_fun(vals));
+}
+
static val and_fun(struct args *vals)
{
val item = t;
@@ -6370,6 +6387,11 @@ static val and_fun(struct args *vals)
return item;
}
+static val nand_fun(struct args *vals)
+{
+ return tnil(!and_fun(vals));
+}
+
static val progn_fun(struct args *vals)
{
return if3(vals->list, car(lastcons(vals->list)), vals->arg[vals->fill - 1]);
@@ -6816,6 +6838,8 @@ void eval_init(void)
reg_mac(sys_qquote_s, me_qquote_f);
reg_mac(intern(lit("equot"), user_package), func_n2(me_equot));
reg_mac(intern(lit("pprof"), user_package), func_n2(me_pprof));
+ reg_mac(intern(lit("nand"), user_package), func_n2(me_nand));
+ reg_mac(intern(lit("nor"), user_package), func_n2(me_nor));
reg_mac(when_s, func_n2(me_when));
reg_mac(intern(lit("unless"), user_package), func_n2(me_unless));
reg_mac(while_s, me_while_until_f);
@@ -7089,13 +7113,17 @@ void eval_init(void)
reg_fun(intern(lit("andf"), user_package), func_n0v(andv));
reg_fun(intern(lit("orf"), user_package), func_n0v(orv));
reg_fun(intern(lit("notf"), user_package), func_n1(notf));
+ reg_fun(intern(lit("nandf"), user_package), func_n0v(nandv));
+ reg_fun(intern(lit("norf"), user_package), func_n0v(norv));
reg_fun(intern(lit("iff"), user_package), func_n3o(iff, 1));
reg_fun(intern(lit("iffi"), user_package), func_n3o(iffi, 2));
reg_fun(intern(lit("dup"), user_package), func_n1(dupl));
reg_fun(intern(lit("flipargs"), user_package), func_n1(swap_12_21));
reg_fun(if_s, func_n3o(if_fun, 2));
reg_fun(or_s, func_n0v(or_fun));
+ reg_fun(intern(lit("nor"), user_package), func_n0v(nor_fun));
reg_fun(and_s, func_n0v(and_fun));
+ reg_fun(intern(lit("nand"), user_package), func_n0v(nand_fun));
reg_fun(progn_s, func_n0v(progn_fun));
reg_fun(prog1_s, func_n0v(prog1_fun));
reg_fun(prog2_s, func_n0v(prog2_fun));