From 903c8fd49d8426ae126bb1e95c09d7ed0d4efe5b Mon Sep 17 00:00:00 2001 From: VaclavT Date: Tue, 2 Mar 2021 23:13:05 +0100 Subject: [PATCH] error description less verbose, some params checking added, comments --- ml.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/ml.cpp b/ml.cpp index 14a8f1f..fe9ba00 100644 --- a/ml.cpp +++ b/ml.cpp @@ -635,7 +635,8 @@ MlError::~MlError() { } std::string MlError::description() { - return "error: the expression `" + cause->debug() + "` failed in scope " + to_string(env) + " with message \"" + msg + "\""; + // return "error: the expression `" + cause->debug() + "` failed in scope " + to_string(env) + " with message \"" + msg + "\""; + return "error: the expression `" + cause->debug() + "` with message \"" + msg + "\""; } void MlEnvironment::combine(MlEnvironment const &other) { @@ -1088,9 +1089,9 @@ namespace builtin { HttpClient client; if (args.size() == 2) { - for (const auto &pair_list: args[1].as_list()[0].as_list()) { + for (const auto &hdr_val_pair: args[1].as_list()) { // TODO check its 2 string elements list - const auto &pair = pair_list.as_list(); + const auto &pair = hdr_val_pair.as_list(); headers[pair[0].as_string()] = pair[1].as_string(); } } @@ -1462,6 +1463,7 @@ namespace builtin { if (args.size() != 1) throw MlError(MlValue("head", head), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + std::vector list = args[0].as_list(); if (list.empty()) throw MlError(MlValue("head", head), env, INDEX_OUT_OF_RANGE); @@ -1551,6 +1553,9 @@ namespace builtin { MlValue map_list(std::vector args, MlEnvironment &env) { eval_args(args, env); + if (args.size() != 2) + throw MlError(MlValue("map_list", map_list), env, args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + std::vector result, l = args[1].as_list(), tmp; for (size_t i = 0; i < l.size(); i++) { tmp.push_back(l[i]); @@ -1565,6 +1570,9 @@ namespace builtin { MlValue filter_list(std::vector args, MlEnvironment &env) { eval_args(args, env); + if (args.size() != 2) + throw MlError(MlValue("filter_list", filter_list), env, args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + std::vector result, l = args[1].as_list(), tmp; for (size_t i = 0; i < l.size(); i++) { tmp.push_back(l[i]); @@ -1575,9 +1583,14 @@ namespace builtin { return MlValue(result); } + // >>> (reduce (lambda (x y) (+ (* x 10) y)) 0 '(1 2 3 4)) + // => 1234 MlValue reduce_list(std::vector args, MlEnvironment &env) { eval_args(args, env); + if (args.size() != 3) + throw MlError(MlValue("reduce_list", reduce_list), env, args.size() > 3 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + std::vector l = args[2].as_list(), tmp; MlValue acc = args[1]; for (size_t i = 0; i < l.size(); i++) { @@ -1589,9 +1602,14 @@ namespace builtin { return acc; } + // >>> (range 1 5) + // => (1 2 3 4) MlValue range(std::vector args, MlEnvironment &env) { eval_args(args, env); + if (args.size() != 2) + throw MlError(MlValue("range", range), env, args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + std::vector result; MlValue low = args[0], high = args[1]; if (low.get_type_name() != INT_TYPE && low.get_type_name() != FLOAT_TYPE) @@ -1782,7 +1800,7 @@ int main(int argc, const char **argv) { try { load_std_lib(env); // for xcode profiling - run(read_file_contents("/Users/vaclavt/Development/mlisp/tests/test.lsp"), env); + // run(read_file_contents("/Users/vaclavt/Development/mlisp/tests/test.lsp"), env); if (argc == 1 || (argc == 2 && std::string(argv[1]) == "-i")) repl(env);