aboutsummaryrefslogtreecommitdiff
path: root/src/primitives.c
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-20 21:19:25 +0800
committerMistivia <i@mistivia.com>2025-06-20 21:19:32 +0800
commit4fa87778453cb0364cb6fa1c53481484622658f4 (patch)
tree96dd407432352959062c2a40e85b1f6f0892c59c /src/primitives.c
parent0a6ff7031819b77e978f5c9f99eecb0577179ba7 (diff)
and/or/not
Diffstat (limited to 'src/primitives.c')
-rw-r--r--src/primitives.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/primitives.c b/src/primitives.c
index 266a8b7..510ca1e 100644
--- a/src/primitives.c
+++ b/src/primitives.c
@@ -327,6 +327,30 @@ SExpRef primitive_quasi(Interp *interp, SExpRef args) {
return ret;
}
+SExpRef primitive_and(Interp *interp, SExpRef args) {
+ if (lisp_length(interp, args) < 1) return new_error(interp, "and: syntax error.\n");
+ SExpRef ret;
+ SExpRef i = args;
+ while (!NILP(i)) {
+ ret = EVAL(CAR(i));
+ if (!TRUEP(ret)) return ret;
+ i = CDR(i);
+ }
+ return ret;
+}
+
+SExpRef primitive_or(Interp *interp, SExpRef args) {
+ if (lisp_length(interp, args) < 1) return new_error(interp, "or: syntax error.\n");
+ SExpRef ret;
+ SExpRef i = args;
+ while (!NILP(i)) {
+ ret = EVAL(CAR(i));
+ if (TRUEP(ret)) return ret;
+ i = CDR(i);
+ }
+ return ret;
+}
+
// TODO:
// - defmacro
// - macroexpand-1