added two string functions, doc updates
This commit is contained in:
44
ml.cpp
44
ml.cpp
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user