Robert Bradshaw wrote:
> On May 13, 2008, at 5:15 AM, Stefan Behnel wrote:
>> for x in iterable:
>>
>> and
>>
>> for x in 1 < x <= 5:
>>
>> instead of the new
>>
>> for 1 < x <= 5:
>>
>> purely for readability (and obviously keeping the old "from"
>> spelling for
>> compatibility).
>
> I'm -1 for having lots of multiple ways to do for loops
I agree, but since Greg brought up the third way of doing it because he
didn't like the integer loop syntax, I wanted to discuss what a good
syntax would be here *iff* he wants to change it.
> Also, "from" makes it
> clear that this is a special cython loop--consider the following:
>
> x = 1
>
> class A:
> def __gt__(self, other):
> return range(3,7)
>
> for x in 0 <= x < A():
> print x
>
>
> This is valid Python (prints 3, 4, 5, 6), and would act completely
> differently under your proposal.
What an ugly example. ;)
But I see that this syntax cannot be accepted in that case. Which leaves
us with the question if Cython should support the shorted integer loop
syntax which Pyrex now has. I guess supporting it and not promoting it
would be ok.
> I do think optimizing enumerate/zip/etc is feasible and probably
> worthwhile.
I'm just concerned about too many special cases in the optimiser.
If we start optimising these (and I would prefer giving range(), zip() &
friends their Py3 iterator semantics in this case), we should come up with
a generic way to support iterator chaining in C code rather than making
the looping code even more complicated and special casing.
When we loop over a chain of iterators, this example
for i,k in enumerate(range(100)):
l += i*k
could become something like this:
c_range_state = c_range_new(100)
c_enumerate_state = c_enumerate_new()
while 1:
temp1 = c_range_next(c_range_state); if (!temp1) ...
temp2 = c_enumerate_next(c_enumerate_state, temp1); if (!temp2) ...
i,k = temp2
l += i*k
c_range_free(c_range_state)
c_enumerate_free(c_enumerate_state)
Maybe a subclassable ForLoopNode class with a way to generate the start,
body and end code of a loop might be an idea. That way, we could chain the
subclasses that know how to loop over a list, range(), enumerate(), etc.,
and we wouldn't even need malloc as everything could live in local
variables.
Stefan
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev