On Sun, 20 Aug 2023 at 09:28, Celelibi <celel...@gmail.com> wrote:
> Just as a reminder of C/C++: {pre,post}-{inc,dec}rementations bring
> their lot of issues with the language. Mostly the infamous *undefined
> behavors*. If you've done some C or C++ this very expression might
> send shivers down your spine.

The ONLY reason that this is undefined is to allow different compilers
to optimize differently. Python does not need to hyper-optimize and
could easily give this a clear definition.

> Assuming a = 0, what's the value of a after: a = a++ ?
> What's the value of the expression (a++) + (++a) ?
> What values are passed to the function with: f(a, a++, a) ?
>
> I am not sure these would be welcome in python. And allowing such
> syntax wouldn't feel really pythonic.

It would be trivially easy for the language to simply pick a
definition. For example, here's a consistent evaluation pattern for
all of them:

1) a = a++
LOAD a
INCREMENT a
STORE a
Result: a has not changed

2) (a++) + (++a)
LOAD a
INCREMENT a
INCREMENT a
LOAD a
BINARY_ADD
Result: a gets incremented twice, and the final sum is equal to 2a+1
(for the original a).

3) f(a, a++, a)
LOAD f
LOAD a
LOAD a
INCREMENT a
LOAD a
FUNCTION_CALL 3 args
Result: f(a, a, a+1) and a ends up incremented once.

This is using a pseudo-bytecode similar to CPython's, with a new
operation "INCREMENT" that can be considered to be equivalent to "a +=
1" (which otherwise can't be inserted in the middle of an expression).

> The worst part is not that the evaluation order is not always defined.
> It's that even if it were, most people wouldn't remember the rules
> since they're not obvious from the syntax. I'm not even sure most C
> programmers know what a "sequence point" is.

It hardly matters, because again, it's only because C needs the
freedom to hyper-optimize. Python doesn't. Python can simply define
that the increment happens immediately.

> Some of the backlash about the walrus operator was precisely that it
> makes the order of evaluation much more important to know in order to
> understand a program.
> Assuming a = 0, what does this do: print(a, (a := a + 1), a) ?

Python evaluates left-to-right. This is a language guarantee. It will
print out "0 1 1".

> At least python makes it defined and obvious *when* the side effect
> occurs... As long as you know that expressions are evaluation left to
> right.

Exactly.

I don't think Python needs pre-increment or post-increment, since
their best value is in situations that can be handled differently
(example: an array with its index or denoter can be stepped with
"arr[d++]", but in Python, you could take its iterator and step it
with "next(it)", with no great cost other than that you can't
implement Star Wars merge sort using "arr1[d1++]" and "arr2[d2++]").
If you really DO need a post-incremented value, it wouldn't be too
hard to have a "moving box" class:

class Box:
    def __init__(self, value):
        self.value = value
    def next(self):
        ret = self.value
        self.value += 1
        return ret

Sure, it's not as clean, but the bar for syntax is high and the value
here doesn't really reach that.

But it wouldn't be undefined or underdefined.

ChrisA
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/AW2TYG3YWG2LPFEH3MVSLSIJL435AZ7A/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to