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)
MlValue do_block(std::vector<MlValue> 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<MlValue> 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<MlValue> args, MlEnvironment &env) {
std::vector<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> 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<MlValue> args, MlEnvironment &env) {
// Is not a special form, so we can evaluate our args.
eval_args(args, env);
std::vector<MlValue> 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<MlValue> args, MlEnvironment &env) {
// Is not a special form, so we can evaluate our args.
eval_args(args, env);
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) {
// Is not a special form, so we can evaluate our args.
eval_args(args, env);
std::vector<MlValue> l = args[2].as_list(), tmp;
@ -1605,7 +1570,6 @@ namespace builtin {
}
MlValue range(std::vector<MlValue> args, MlEnvironment &env) {
// Is not a special form, so we can evaluate our args.
eval_args(args, env);
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);
}
// 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<MlValue> 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")

View File

@ -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))