On Thu, Oct 13, 2016 at 11:42 PM Paul Moore <p.f.moore@gmail.com> wrote:
I remain puzzled.

Given the well-documented and understood transformation:

[fn(x) for x in lst if cond]

translates to

result = []
for x in lst:
   if cond:
      result.append(fn(x))

please can you explain how to modify that translation rule to
incorporate the suggested syntax?

if you allow result.append(1, 2, 3) to mean result.extend([1,2,3])  # which was discussed before

result = []
for x in lst:
   if cond:
      result.append(*fn(x))  

Or simply use result.extend([*fn(x)])

Personally, I'm not even sure any more that I can *describe* the
suggested syntax. Where in [fn(x) for x in lst if cond] is the *
allowed? fn(*x)? *fn(x)? Only as *x with a bare variable, but no
expression? Only in certain restricted types of construct which aren't
expressions but are some variation on an unpacking construct?


The star is always exactly at the place that should "handle" it. which means [*(fn(x)) for x in lst if cond]. fn(x) must be iterable as always.
 
We've had a lot of examples. I think it's probably time for someone to
describe the precise syntax (as BNF, like the syntax in the Python
docs at https://docs.python.org/3.6/reference/expressions.html#displays-for-lists-sets-and-dictionaries
and following sections) and semantics (as an explanation of how to
rewrite any syntactically valid display as a loop). It'll have to be
done in the end, as part of any implementation, so why not now?


I will be happy to do so, and will be happy to work with anyone else interested.

Elazar