Hi Paul,

I suggest that you just go straight to the PEP phase.

--Guido

On Thu, Feb 4, 2021 at 11:54 PM Paul Sokolovsky <pmis...@gmail.com> wrote:

> Hello,
>
> Everyone knows how hard to find a compelling usecase for the assignment
> expression operator (":=", colloquially "walrus operator").
> https://www.python.org/dev/peps/pep-0572/ examples never felt
> compelling and we all remember the split it caused.
>
> I finally found a usecase where *not* using assignment expression is
> *much* worse than using it. I'm working on SSA (Static Single
> Assignment,
> https://en.wikipedia.org/wiki/Static_single_assignment_form) conversion
> of Python programs, where there's a need to "join" dataflow of values
> from different control flow paths using a special function (Phi
> function). This "joining" itself creates a new variable, and of course,
> the original variable was used in an expression. We've got
> assignment in expression, assignment expression operator to the rescue!
>
> With it, a simple loop like:
>
> ----
> a = 0
> while a < 5:
>     a += 1
> ----
>
> becomes:
>
> ----
> a0 = 0
> while (a1 := phi(a0, a2)) < 5:
>     a2 = a1 + 1
> ----
>
> So far, so good. But semantics of Phi function is parallel assignment.
> No problem with Python either, "a, b = b, c" is exactly parallel
> assignment. So, let's try example with 2 variables:
>
> ----
> a = 0
> b = 10
> while a < 5:
>     a += 1
>     b += 1
> ----
>
> becomes:
>
> ----
> a0 = 0
> b0 = 10
> while ((a1, b1) := phi([a0, a2], [b0, b2]))[0] < 5:
>     a2 = a1 + 1
>     b2 = b1 + 1
> ----
>
> But oops:
>
> > SyntaxError: cannot use assignment expressions with tuple
>
> To reproduce in the REPL:
>
> ----
> >>> ((a, b) := (1, 2))
>   File "<stdin>", line 1
> SyntaxError: cannot use assignment expressions with tuple
> ----
>
> Why this accidental syntactic gap? Why assignment statement can do
> parallel assignment with a tuple on LHS, and assignment operator
> suddenly can't?
>
> Why the adhoc naming and conceptual shift on the AST level, when PEP572
> explicitly talks about *assignment operator*, but corresponding node on
> the AST level is called NamedExpr? Why look at assignment expression as
> "name of expression" instead of assignment expression per se?
>
> It's of course not a problem to recast:
>
> NamedExpr(expr target, expr value)
>
> to
>
> NamedExpr(expr* target, expr value)
>
> in the ASDL (and it works out of the box), the point is that it should
> have been ExprAssign from the start (folloing the AugAssign and
> AnnAssign tradition).
>
>
> --
> Best regards,
>  Paul                          mailto:pmis...@gmail.com
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-le...@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/6IFDG7PAFPHVPGULANOQDAHP2X743HCE/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


-- 
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/CATW4D6SP6ZYHBQYBIXGT7UWJCQ6F2GQ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to