From 337fb2f80dee2ea736bd90c8cf93ea7fe5ebf4e4 Mon Sep 17 00:00:00 2001 From: VaclavT Date: Sun, 28 Mar 2021 13:37:54 +0200 Subject: [PATCH] and and or added --- ml.cpp | 23 +++++++++++++++++++++++ stdlib/stdlib.lsp | 7 ------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ml.cpp b/ml.cpp index b41fdaa..1af8db5 100644 --- a/ml.cpp +++ b/ml.cpp @@ -984,6 +984,27 @@ namespace builtin { return MlValue(v); } + // Evaluate logical and on a list of expressions (SPECIAL FORM) + MlValue do_and(std::vector args, MlEnvironment &env) { + if (args.size() < 2) + throw MlError(MlValue("and", do_and), env, TOO_FEW_ARGS); + + for (size_t i = 0; i < args.size(); i++) + if (!args[i].eval(env).as_bool()) return MlValue::nil(); + + return MlValue{1l}; + } + + // Evaluate logical or on a list of expressions (SPECIAL FORM) + MlValue do_or(std::vector args, MlEnvironment &env) { + if (args.size() < 2) + throw MlError(MlValue("or", do_or), env, TOO_FEW_ARGS); + + for (size_t i = 0; i < args.size(); i++) + if (args[i].eval(env).as_bool()) return MlValue{1l}; + + return MlValue::nil(); + } // Exit the program with an integer code MlValue exit(std::vector args, MlEnvironment &env) { @@ -1760,6 +1781,8 @@ MlValue MlEnvironment::get(const std::string &name) const { if (name == "defun") return MlValue("defun", builtin::defun); if (name == "lambda") return MlValue("lambda", builtin::lambda); if (name == "benchmark") return MlValue("benchmark", builtin::benchmark); + if (name == "and") return MlValue("and", builtin::do_and); + if (name == "or") return MlValue("or", builtin::do_or); // Comparison operations if (name == "=") return MlValue("=", builtin::eq); diff --git a/stdlib/stdlib.lsp b/stdlib/stdlib.lsp index da263cf..eeb8069 100644 --- a/stdlib/stdlib.lsp +++ b/stdlib/stdlib.lsp @@ -1,13 +1,6 @@ ; not a bool (defun not (x) (if x 0 1)) -; logical and -(defun and (a b) (if a (if b 1 0) 0)) - -; logical or -(defun or (a b) (if a 1 (if b 1 0))) - - ; negate a number (defun neg (n) (- 0 n))