public override DynValue Visit(IndexingNode indexingNode)
        {
            var indexable = Visit(indexingNode.Indexable);
            var keyValue  = Visit(indexingNode.KeyExpression);

            return(IndexDynValue(indexable, keyValue, indexingNode));
        }
        private DynValue IndexDynValue(DynValue indexable, DynValue keyValue, IndexingNode indexingNode)
        {
            switch (indexable.Type)
            {
            case DynValueType.String:
            {
                if (keyValue.Type != DynValueType.Number)
                {
                    throw new RuntimeException($"Attempt to index a string using {keyValue.Type}.",
                                               indexingNode.Line);
                }

                var index = (int)keyValue.Number;

                if (index < 0)
                {
                    if (indexable.String.Length + index < 0)
                    {
                        throw new RuntimeException("String index out of bounds.", indexingNode.Line);
                    }

                    return(new DynValue(
                               indexable.String[^ (-index)]
Example #3
0
 public abstract DynValue Visit(IndexingNode indexingNode);