diff options
| author | Mistivia <i@mistivia.com> | 2025-06-20 21:19:25 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-06-20 21:19:32 +0800 |
| commit | 4fa87778453cb0364cb6fa1c53481484622658f4 (patch) | |
| tree | 96dd407432352959062c2a40e85b1f6f0892c59c /src/primitives.c | |
| parent | 0a6ff7031819b77e978f5c9f99eecb0577179ba7 (diff) | |
and/or/not
Diffstat (limited to 'src/primitives.c')
| -rw-r--r-- | src/primitives.c | 24 |
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 |
