load stdlib on startup added - init version

This commit is contained in:
VaclavT 2021-02-15 00:06:24 +01:00
parent 4bc784ba80
commit 140abbccd4
2 changed files with 31 additions and 44 deletions

65
ml.cpp
View File

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

View File

@ -29,4 +29,14 @@
; is a number negative? ; is a number negative?
(defun is-neg? (n) (< n 0)) (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))