Well, there need not be any ambiguity if you think of "B given A" as "execute A before B", and remember that "given" has a lower precedence than "for" (So [B given A for x in seq] is parsed as
[(B given A) for x in seq]
Then
retval = [expr(name) given name=something(x) for x in seq]
Is:
retval = []
for x in seq:
name = something(x)
retval.append(expr(name))
And
retval = [expr(name, x) for x in seq given name=something]
Is:
retval = []
name = something
for x in seq:
retval.append(expr(name, x))
But this is probably not a great solution, as it forces you to mentally unwrap comprehensions in a strange order and remember a non-obvious precedence rule.
You hit the nail on the head. It forces you to unwarp comprehensions in a strange order. This is why I want the "given" to be interspersed with the "for" and "if" and for everything to be in the order you declare it.
On the plus-side, it lets you initialize generators with in-loop updates (which cannot as far as I see be done nicely with ":="):
retval = [expr(name, x) given name=update(name, x) for x in seq given name=something]
Is:
retval = []
name = something
for x in seq:
name = update(name, x)
retval.append(expr(name, x))
Why wouldn't you want to just put the outer given outside the entire comprehension?
retval = [expr(name, x) given name=update(name, x) for x in seq] given name=something
The more I think about it, the more i want to keep "given" in comprehensions, and given in expressions using parentheses when given is supposed to bind to the expression first.