regexp-search added, std lib loader changes, more REadme items
This commit is contained in:
30
ml.cpp
30
ml.cpp
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user