From 140abbccd488caba3f2d513665a96a048f3c0be4 Mon Sep 17 00:00:00 2001 From: VaclavT Date: Mon, 15 Feb 2021 00:06:24 +0100 Subject: [PATCH] load stdlib on startup added - init version --- ml.cpp | 65 +++++++++++++++------------------------------- stdlib/stdlib.lisp | 10 +++++++ 2 files changed, 31 insertions(+), 44 deletions(-) diff --git a/ml.cpp b/ml.cpp index 47a0fa6..2adc85a 100644 --- a/ml.cpp +++ b/ml.cpp @@ -1004,8 +1004,8 @@ namespace builtin { // Evaluate a block of expressions in the current environment (SPECIAL FORM) MlValue do_block(std::vector args, MlEnvironment &env) { MlValue acc; - for (size_t i = 0; i < args.size(); i++) - acc = args[i].eval(env); + for (auto & arg : args) + acc = arg.eval(env); return acc; } @@ -1013,16 +1013,16 @@ namespace builtin { MlValue scope(std::vector args, MlEnvironment &env) { MlEnvironment e = env; MlValue acc; - for (size_t i = 0; i < args.size(); i++) - acc = args[i].eval(e); + for (auto & arg : args) + acc = arg.eval(e); return acc; } // Quote an expression (SPECIAL FORM) MlValue quote(std::vector args, MlEnvironment &env) { std::vector v; - for (size_t i = 0; i < args.size(); i++) - v.push_back(args[i]); + for (const auto & arg : args) + v.push_back(arg); return MlValue(v); } @@ -1039,7 +1039,6 @@ namespace builtin { // Print several values and return the last one MlValue print(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() < 1) @@ -1058,7 +1057,6 @@ namespace builtin { // Get user input with an optional prompt MlValue input(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() > 1) @@ -1074,7 +1072,6 @@ namespace builtin { // Get a random number between two numbers inclusively MlValue random(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1102,7 +1099,6 @@ namespace builtin { // Get the contents of a file MlValue read_file(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1113,7 +1109,6 @@ namespace builtin { // Write a string to a file MlValue write_file(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1130,7 +1125,6 @@ namespace builtin { // Read URL to (code content) MlValue read_url(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); // PERF optimize it for memory usage and performance @@ -1237,7 +1231,6 @@ namespace builtin { // Evaluate a value as code MlValue eval(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1247,7 +1240,6 @@ namespace builtin { // Create a list of values MlValue list(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); return MlValue(args); @@ -1255,7 +1247,6 @@ namespace builtin { // Sum multiple values MlValue sum(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() < 2) @@ -1269,7 +1260,6 @@ namespace builtin { // Subtract two values MlValue subtract(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1279,7 +1269,6 @@ namespace builtin { // Multiply several values MlValue product(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() < 2) @@ -1293,7 +1282,6 @@ namespace builtin { // Divide two values MlValue divide(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1303,7 +1291,6 @@ namespace builtin { // Get the remainder of values MlValue remainder(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1313,7 +1300,6 @@ namespace builtin { // Are two values equal? MlValue eq(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1323,7 +1309,6 @@ namespace builtin { // Are two values not equal? MlValue neq(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1333,7 +1318,6 @@ namespace builtin { // Is one number greater than another? MlValue greater(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1343,7 +1327,6 @@ namespace builtin { // Is one number less than another? MlValue less(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1353,7 +1336,6 @@ namespace builtin { // Is one number greater than or equal to another? MlValue greater_eq(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1363,7 +1345,6 @@ namespace builtin { // Is one number less than or equal to another? MlValue less_eq(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1373,7 +1354,6 @@ namespace builtin { // Get the type name of a value MlValue get_type_name(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1384,7 +1364,6 @@ namespace builtin { // Cast an item to a float MlValue cast_to_float(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1394,7 +1373,6 @@ namespace builtin { // Cast an item to an int MlValue cast_to_int(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1404,7 +1382,6 @@ namespace builtin { // Index a list MlValue index(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1420,7 +1397,6 @@ namespace builtin { // Insert a value into a list MlValue insert(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 3) @@ -1437,7 +1413,6 @@ namespace builtin { // Remove a value at an index from a list MlValue remove(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 2) @@ -1454,7 +1429,6 @@ namespace builtin { // Get the length of a list MlValue len(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1467,7 +1441,6 @@ namespace builtin { // Add an item to the end of a list MlValue push(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() == 0) @@ -1478,7 +1451,6 @@ namespace builtin { } MlValue pop(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1487,7 +1459,6 @@ namespace builtin { } MlValue head(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1500,7 +1471,6 @@ namespace builtin { } MlValue tail(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1515,7 +1485,6 @@ namespace builtin { } MlValue parse(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1531,7 +1500,6 @@ namespace builtin { } MlValue replace(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 3) @@ -1543,7 +1511,6 @@ namespace builtin { } MlValue display(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1553,7 +1520,6 @@ namespace builtin { } MlValue debug(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); if (args.size() != 1) @@ -1563,7 +1529,6 @@ namespace builtin { } MlValue map_list(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); std::vector result, l = args[1].as_list(), tmp; @@ -1575,8 +1540,9 @@ namespace builtin { return MlValue(result); } + //>>> (filter (lambda (x) (> x 2)) '(1 2 3 4 5)) + // => (3 4 5) MlValue filter_list(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); std::vector result, l = args[1].as_list(), tmp; @@ -1590,7 +1556,6 @@ namespace builtin { } MlValue reduce_list(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); std::vector l = args[2].as_list(), tmp; @@ -1605,7 +1570,6 @@ namespace builtin { } MlValue range(std::vector args, MlEnvironment &env) { - // Is not a special form, so we can evaluate our args. eval_args(args, env); std::vector result; @@ -1768,6 +1732,16 @@ MlValue MlEnvironment::get(const std::string& name) const { throw MlError(MlValue::atom(name), *this, ATOM_NOT_DEFINED); } +// load lisp std library +void load_std_lib(MlEnvironment &env) { + // TODO iterate through dir with files + std::string filename = "stdlib/stdlib.lisp"; + + MlEnvironment e; + MlValue result = run(read_file_contents(filename), e); + env.combine(e); +} + int main(int argc, const char **argv) { MlEnvironment env; std::vector args; @@ -1778,6 +1752,9 @@ int main(int argc, const char **argv) { #ifdef USE_STD srand(time(NULL)); try { + // Load std library + load_std_lib(env); + if (argc == 1 || (argc == 2 && std::string(argv[1]) == "-i")) repl(env); else if (argc == 3 && std::string(argv[1]) == "-c") diff --git a/stdlib/stdlib.lisp b/stdlib/stdlib.lisp index a9c9b8c..b56f009 100644 --- a/stdlib/stdlib.lisp +++ b/stdlib/stdlib.lisp @@ -29,4 +29,14 @@ ; is a number negative? (defun is-neg? (n) (< n 0)) +; return second element of list +(defun second (l) (index l 1)) + +; return third element of list +(defun third (l) (index l 2)) + +; return fourth element of list +(defun fourth (l) (index l 3)) + +