diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/expr.cc | 5 | ||||
-rw-r--r-- | src/func.cc | 12 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/expr.cc b/src/expr.cc index fc1fbf0..7e1a25b 100644 --- a/src/expr.cc +++ b/src/expr.cc @@ -85,6 +85,11 @@ Value Expression::evaluate(const Context *context) const if (i >= 0 && i < int(v1.vec.size())) return *v1.vec[i]; } + if (v1.type == Value::STRING && v2.type == Value::NUMBER) { + int i = (int)(v2.num); + if (i >= 0 && i < v1.text.size()) + return Value(v1.text.substr(i, 1)); + } return Value(); } if (this->type == "I") diff --git a/src/func.cc b/src/func.cc index 4451267..1138173 100644 --- a/src/func.cc +++ b/src/func.cc @@ -290,6 +290,17 @@ Value builtin_exp(const Context *, const std::vector<std::string>&, const std::v return Value(); } +Value builtin_length(const Context *, const std::vector<std::string>&, const std::vector<Value> &args) +{ + if (args.size() == 1){ + if (args[0].type == Value::VECTOR) + return Value((double) args[0].vec.size()); + if (args[0].type == Value::STRING) + return Value((double) args[0].text.size()); + } + return Value(); +} + Value builtin_log(const Context *, const std::vector<std::string>&, const std::vector<Value> &args) { if (args.size() == 2 && args[0].type == Value::NUMBER && args[1].type == Value::NUMBER) @@ -391,6 +402,7 @@ void register_builtin_functions() Builtins::init("pow", new BuiltinFunction(&builtin_pow)); Builtins::init("sqrt", new BuiltinFunction(&builtin_sqrt)); Builtins::init("exp", new BuiltinFunction(&builtin_exp)); + Builtins::init("len", new BuiltinFunction(&builtin_length)); Builtins::init("log", new BuiltinFunction(&builtin_log)); Builtins::init("ln", new BuiltinFunction(&builtin_ln)); Builtins::init("str", new BuiltinFunction(&builtin_str)); |