示例#1
0
    protected override DyObject IterateOp(ExecutionContext ctx, DyObject self)
    {
        if (self is IEnumerable <DyObject> seq)
        {
            return(DyIterator.Create(seq));
        }

        return(Nil);
    }
示例#2
0
    protected override DyObject AddOp(ExecutionContext ctx, DyObject left, DyObject right)
    {
        var arr = new List <DyObject>();

        arr.AddRange(DyIterator.ToEnumerable(ctx, left));
        if (ctx.HasErrors)
        {
            return(Nil);
        }
        arr.AddRange(DyIterator.ToEnumerable(ctx, right));
        if (ctx.HasErrors)
        {
            return(Nil);
        }
        return(new DyTuple(arr.ToArray()));
    }
示例#3
0
    protected override DyObject CastOp(ExecutionContext ctx, DyObject self, DyTypeInfo targetType)
    {
        if (targetType.ReflectedTypeId == self.TypeId)
        {
            return(self);
        }

        var xs = (DyCollection)self;

        return(targetType.ReflectedTypeId switch
        {
            Dy.Tuple => new DyTuple(xs.ToArray()),
            Dy.Array => new DyArray(xs.ToArray()),
            Dy.Iterator => DyIterator.Create(xs),
            Dy.Set => new DySet(new HashSet <DyObject>(xs.ToArray())),
            _ => base.CastOp(ctx, self, targetType)
        });
示例#4
0
    internal static void WriteAllLines(ExecutionContext ctx, string path, DyObject value, int?encoding = null)
    {
        var enc = GetEncoding(ctx, encoding);
        var seq = DyIterator.ToEnumerable(ctx, value).ToArray();

        if (ctx.HasErrors)
        {
            return;
        }

        var strings = seq.Select(s => s.ToString(ctx).Value).ToArray();

        if (ctx.HasErrors)
        {
            return;
        }

        ctx.Handle(() => File.WriteAllLines(path, strings, enc));
    }
示例#5
0
    protected override DyObject GetOp(ExecutionContext ctx, DyObject self, DyObject index)
    {
        if (index is not DyInteger ix)
        {
            return(ctx.IndexOutOfRange(index));
        }

        var i = (int)ix.Value;

        try
        {
            var iter = DyIterator.ToEnumerable(ctx, self);
            return(i < 0 ? iter.ElementAt(^ -i) : iter.ElementAt(i));
        }
        catch (ArgumentOutOfRangeException)
        {
            ctx.Error = new(DyError.IndexOutOfRange, index);
            return(Nil);
        }
    }
示例#6
0
    internal static DyObject[] ConcatValues(ExecutionContext ctx, params DyObject[] values)
    {
        if (values is null)
        {
            return(Array.Empty <DyObject>());
        }

        var arr = new List <DyObject>();

        for (var i = 0; i < values.Length; i++)
        {
            var seq = DyIterator.ToEnumerable(ctx, values[i]);

            if (ctx.HasErrors)
            {
                break;
            }

            arr.AddRange(seq);
        }

        return(arr.ToArray());
    }
示例#7
0
    protected override DyObject LengthOp(ExecutionContext ctx, DyObject self)
    {
        var seq = DyIterator.ToEnumerable(ctx, self);

        return(ctx.HasErrors ? Nil : DyInteger.Get(seq.Count()));
    }
示例#8
0
 protected override DyObject AddOp(ExecutionContext ctx, DyObject left, DyObject right) => DyIterator.Create(Concat(ctx, left, right));
示例#9
0
 private static DyObject Iterate(ExecutionContext ctx, DyObject self) =>
 DyIterator.Create(((DyClass)self).Fields);