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)]
public abstract DynValue Visit(IndexingNode indexingNode);