regexp-search added, std lib loader changes, more REadme items

This commit is contained in:
2021-02-21 14:03:14 +01:00
parent 0ba8536aa2
commit a87964f552
8 changed files with 97 additions and 40 deletions

30
ml.cpp
View File

@@ -889,6 +889,7 @@ namespace builtin {
MlValue if_then_else(std::vector<MlValue> args, MlEnvironment &env) {
if (args.size() != 3)
throw MlError(MlValue("if", if_then_else), env, args.size() > 3 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
if (args[0].eval(env).as_bool())
return args[1].eval(env);
else return args[2].eval(env);
@@ -1487,6 +1488,15 @@ namespace builtin {
return MlValue::string(src);
}
MlValue regex_search(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
if (args.size() != 2) // if (args.size() < 2 || args.size() > 3)
throw MlError(MlValue("regex_search", regex_search), env, args.size() > 3 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
return MlValue(regexp_search(args[0].as_string(), args[1].as_string()));
}
MlValue display(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
@@ -1597,14 +1607,19 @@ void repl(MlEnvironment &env) {
}
}
// load lisp std library
void load_std_lib(MlEnvironment &env) {
// TODO iterate through dir with files
std::string filename = "stdlib/stdlib.lisp";
std::string loader = R"( (define ___lib_path '("/usr/local/var/mlisp"))
(for d ___lib_path
(if (is-dir? d)
(for f (ls-dir d)
(if (regex-search? f "^.*\.l(i)?sp$")
(include (+ d "/" f))
'())
)
'()))
)";
MlEnvironment e;
MlValue result = run(read_file_contents(filename), e);
env.combine(e);
run(loader, env);
}
// Does this environment, or its parent environment, have a variable?
@@ -1700,8 +1715,9 @@ MlValue MlEnvironment::get(const std::string &name) const {
// String operations
if (name == "debug") return MlValue("debug", builtin::debug);
if (name == "replace") return MlValue("replace", builtin::replace);
if (name == "display") return MlValue("display", builtin::display);
if (name == "replace") return MlValue("replace", builtin::replace);
if (name == "regex-search?") return MlValue("regex-search?", builtin::regex_search);
// Casting operations
if (name == "int") return MlValue("int", builtin::cast_to_int);