added two string functions, doc updates

This commit is contained in:
2021-05-10 19:07:50 +02:00
parent 783aa6976b
commit a752ebdf12
7 changed files with 98 additions and 42 deletions

44
ml.cpp
View File

@@ -40,6 +40,7 @@
#define INTERNAL_ERROR "internal virtual machine error"
#define INDEX_OUT_OF_RANGE "index out of range"
#define MALFORMED_PROGRAM "malformed program"
#define NOT_IMPLEMENTED_YET_ERROR "not implemented yet"
#define STRING_TYPE "string"
@@ -1552,9 +1553,6 @@ namespace builtin {
throw MlError(args[0], env, INVALID_ARGUMENT);
std::vector<MlValue> parsed = ::parse(args[0].as_string());
// if (parsed.size() == 1)
// return parsed[0];
// else return MlValue(parsed);
return MlValue(parsed);
}
@@ -1602,11 +1600,46 @@ namespace builtin {
eval_args(args, env);
if (args.size() != 2)
throw MlError(MlValue("string_case", string_case), env, args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
throw MlError(MlValue("string-case", string_case), env, args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
return MlValue::string(string_lucase(args[0].as_string(), args[1].as_string()));
}
MlValue string_len(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
if (args.size() != 1)
throw MlError(MlValue("string-len", string_len), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
return MlValue{(long)args[0].as_string().size()};
}
MlValue string_substr(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
if (args.size() < 1 || args.size() > 3)
throw MlError(MlValue("string-substr", string_substr), env, args.size() > 3 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
const std::string& str = args[0].as_string();
long pos = args.size() > 1 ? args[1].as_int() : 0;
long count = args.size() > 2 ? args[2].as_int() : str.size();
return MlValue::string(string_substring(str, pos, count));
}
MlValue string_find(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
if (args.size() < 2 || args.size() > 3)
throw MlError(MlValue("string-find", string_find), env, args.size() > 3 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
size_t start_pos = args.size() > 2 ? args[2].as_int() : 0;
size_t pos = string_find_substr(args[0].as_string(), args[1].as_string(), start_pos);
return pos == -1 ? MlValue::nil() : MlValue((long)pos);
}
// trims characters " \n\r\t" from left or right or both ends of a string
MlValue string_rltrim(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
@@ -1966,6 +1999,9 @@ MlValue MlEnvironment::get(const std::string &name) const {
if (name == "string-pad") return MlValue("string-pad", builtin::string_pad);
if (name == "string-rltrim") return MlValue("string-rltrim", builtin::string_rltrim);
if (name == "string-case") return MlValue("string-case", builtin::string_case);
if (name == "string-len") return MlValue("string-len", builtin::string_len);
if (name == "string-substr") return MlValue("string-substr", builtin::string_substr);
if (name == "string-find") return MlValue("string-find", builtin::string_find);
// Casting operations
if (name == "int") return MlValue("int", builtin::cast_to_int);