ACCEPTABLE?: List Comprehensions?

Reinier Zwitserloot reinier at zwitserloot.com
Mon Mar 16 17:54:06 PDT 2009


Paulo,

Scala and Python both have list comprehensions. They both implement  
them according to my sketch: 1 generator expression, filters AFTER the  
source, and multiple sources allowed. They don't allow multiple  
generator expressions and they don't allow you to put ifs on the  
generators (you put them on the sources). Exactly like the syntax I  
sketched in an earlier mail to coin-dev. It seems clear then that the  
main use-case appears to be nested fors (multiple source expressions),  
and not turning a list of 3 elements into something with more than that.

See:

http://docs.python.org/tutorial/datastructures.html#list-comprehensions

http://www.scala-lang.org/node/111

The only saving grace here is that in both scala and python, you can  
take a List<Tuple(String, String)> and turn them into a List<String>  
by unpacking the tuples, fairly easily. This is slightly more  
complicated in java, but not terribly so *IF* we have list literals:

public static <T> List<T> compress(List<List<T>> input) {
    //implementation obvious
}

compress([ [a, a] for int a : intList]); //turns [1, 2, 3] into [1, 1,  
2, 2, 3, 3].



I don't suggest adding it to this proposal. Just highlighting that, if  
certain people really are stumped without this feature, they can solve  
it with minimal effort and 1 static import, which is a lot better than  
nothing at all. I say: err on the side of caution. If the above idiom  
becomes well-used, we can always add a syntax for multiple generator  
expressions at some later point in time.

  --Reinier Zwitserloot



On Mar 16, 2009, at 21:48, Paulo Levi wrote:

> I dunno.
> The major line reduction win is in the nested fors example, but most  
> of the fors i make with a list output are not nested. I would just  
> like that this proposal also adapts to the simple zip or multi-map  
> usage.
>
> Lets see if i understand it:
> Simple copy:
> List<Integer> out = [x for x : in]
> Simple map:
> List<Integer> out = [x+valueToAdd for x : in]
> Multi-map :
> List<Integer> out = [x+valueToAdd, x+3 for x : in] (output list.size  
> = in.size * 2)
> List<Integer> out = [x+valueToAdd if x % 2 == 0, x+3 if x % 2 != 0  
> for x : in]
> Zip:
> List<Integer> out = [x+valueToAdd, y+3 for x : in, y : in2]
> List<Integer> out = [x+valueToAdd if x % 2 == 0, y+3 if x % 2 == 0  
> for x : in, y : in2]
> Nested fors (only 1 condiction allowed):
> [ a + b + c, if a > 5 && c < 2,  for a : intList1, for b : intList,  
> for c : intList]
>
> The nested for is the most bizarre and unusual example of all.
> I see why you put the condition after the for, but i think that is a  
> little less readable.
> If you see the nested fors example you see i'm contracting myself,  
> viz ";" and ",".
> I leave the field to the experts, but please make the main usecase  
> the easiest.




More information about the coin-dev mailing list