diff --git a/src/interpreter.cc b/src/interpreter.cc index 35de34a..e50d635 100644 --- a/src/interpreter.cc +++ b/src/interpreter.cc @@ -137,9 +137,8 @@ Interpreter::Interpreter() operators["."] = +[](Interpreter &i, std::vector args) -> Result { assert(args.size() == 2, "Operator . requires two arguments"); // TODO(assert) - assert(args.front().type == Value::Type::Block, "Only blocks can be indexed"); // TODO(assert) assert(args.back().type == Value::Type::Number, "Only numbers can be used for indexing"); // TODO(assert) - return std::move(args.front()).blk.index(i, std::move(args.back()).n.as_int()); + return std::move(args.front()).index(i, std::move(args.back()).n.as_int()); }; } } diff --git a/src/musique.hh b/src/musique.hh index 9c5ba8f..4648fc4 100644 --- a/src/musique.hh +++ b/src/musique.hh @@ -525,6 +525,7 @@ struct Value bool truthy() const; bool falsy() const; Result operator()(Interpreter &i, std::vector args); + Result index(Interpreter &i, unsigned position); bool operator==(Value const& other) const; }; diff --git a/src/value.cc b/src/value.cc index c84d8cf..dae4ebe 100644 --- a/src/value.cc +++ b/src/value.cc @@ -155,6 +155,19 @@ Result Value::operator()(Interpreter &i, std::vector args) } } +Result Value::index(Interpreter &i, unsigned position) +{ + switch (type) { + case Type::Block: + return blk.index(i, position); + + default: + assert(false, "Block indexing is not supported for this type"); // TODO(assert) + } + + unreachable(); +} + bool Value::truthy() const { switch (type) {