error description less verbose, some params checking added, comments
This commit is contained in:
parent
3868a32168
commit
903c8fd49d
26
ml.cpp
26
ml.cpp
|
|
@ -635,7 +635,8 @@ MlError::~MlError() {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MlError::description() {
|
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) {
|
void MlEnvironment::combine(MlEnvironment const &other) {
|
||||||
|
|
@ -1088,9 +1089,9 @@ namespace builtin {
|
||||||
HttpClient client;
|
HttpClient client;
|
||||||
|
|
||||||
if (args.size() == 2) {
|
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
|
// 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();
|
headers[pair[0].as_string()] = pair[1].as_string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1462,6 +1463,7 @@ namespace builtin {
|
||||||
|
|
||||||
if (args.size() != 1)
|
if (args.size() != 1)
|
||||||
throw MlError(MlValue("head", head), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
|
throw MlError(MlValue("head", head), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
|
||||||
|
|
||||||
std::vector<MlValue> list = args[0].as_list();
|
std::vector<MlValue> list = args[0].as_list();
|
||||||
if (list.empty())
|
if (list.empty())
|
||||||
throw MlError(MlValue("head", head), env, INDEX_OUT_OF_RANGE);
|
throw MlError(MlValue("head", head), env, INDEX_OUT_OF_RANGE);
|
||||||
|
|
@ -1551,6 +1553,9 @@ namespace builtin {
|
||||||
MlValue map_list(std::vector<MlValue> args, MlEnvironment &env) {
|
MlValue map_list(std::vector<MlValue> args, MlEnvironment &env) {
|
||||||
eval_args(args, 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<MlValue> result, l = args[1].as_list(), tmp;
|
std::vector<MlValue> result, l = args[1].as_list(), tmp;
|
||||||
for (size_t i = 0; i < l.size(); i++) {
|
for (size_t i = 0; i < l.size(); i++) {
|
||||||
tmp.push_back(l[i]);
|
tmp.push_back(l[i]);
|
||||||
|
|
@ -1565,6 +1570,9 @@ namespace builtin {
|
||||||
MlValue filter_list(std::vector<MlValue> args, MlEnvironment &env) {
|
MlValue filter_list(std::vector<MlValue> args, MlEnvironment &env) {
|
||||||
eval_args(args, 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<MlValue> result, l = args[1].as_list(), tmp;
|
std::vector<MlValue> result, l = args[1].as_list(), tmp;
|
||||||
for (size_t i = 0; i < l.size(); i++) {
|
for (size_t i = 0; i < l.size(); i++) {
|
||||||
tmp.push_back(l[i]);
|
tmp.push_back(l[i]);
|
||||||
|
|
@ -1575,9 +1583,14 @@ namespace builtin {
|
||||||
return MlValue(result);
|
return MlValue(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// >>> (reduce (lambda (x y) (+ (* x 10) y)) 0 '(1 2 3 4))
|
||||||
|
// => 1234
|
||||||
MlValue reduce_list(std::vector<MlValue> args, MlEnvironment &env) {
|
MlValue reduce_list(std::vector<MlValue> args, MlEnvironment &env) {
|
||||||
eval_args(args, 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<MlValue> l = args[2].as_list(), tmp;
|
std::vector<MlValue> l = args[2].as_list(), tmp;
|
||||||
MlValue acc = args[1];
|
MlValue acc = args[1];
|
||||||
for (size_t i = 0; i < l.size(); i++) {
|
for (size_t i = 0; i < l.size(); i++) {
|
||||||
|
|
@ -1589,9 +1602,14 @@ namespace builtin {
|
||||||
return acc;
|
return acc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// >>> (range 1 5)
|
||||||
|
// => (1 2 3 4)
|
||||||
MlValue range(std::vector<MlValue> args, MlEnvironment &env) {
|
MlValue range(std::vector<MlValue> args, MlEnvironment &env) {
|
||||||
eval_args(args, 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<MlValue> result;
|
std::vector<MlValue> result;
|
||||||
MlValue low = args[0], high = args[1];
|
MlValue low = args[0], high = args[1];
|
||||||
if (low.get_type_name() != INT_TYPE && low.get_type_name() != FLOAT_TYPE)
|
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 {
|
try {
|
||||||
load_std_lib(env);
|
load_std_lib(env);
|
||||||
// for xcode profiling
|
// 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"))
|
if (argc == 1 || (argc == 2 && std::string(argv[1]) == "-i"))
|
||||||
repl(env);
|
repl(env);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue