Fortunately these rules are natural and easy to remember, especially the details of how different languages choose different orders, relative to the confusing and abhorrent prefix notation (- (^ 3 2)) or (^ (- 3) 2).
As a lover of prefix and postfix notation, there is an unambiguous parsing of each of those that does not deepened on any order of operations. Neither lisp nor forth have the question at all - you can only write it exactly as you mean it.
(- (expt 3 2))
is always -9 without needing to ask which has higher precedence.
(expt -3 2)
is likewise always 9. There is no question if - is a binary or unary operator in prefix notation and what its order of operation should be.
Likewise, in dc
3 _ 2 ^ p
_3 2 ^ p
and
3 2 ^ _ p
where '_' is the negation operator (it can be used for writing -3 directly as _3, but _ 3 is a parse error) return their results without any question of order of operations.
(And yes, I do recognize your credentials ... I still think that lisp and forth (above examples for dc) are better notational systems for working with computers even if it takes a bit of head wrapping for humans).
Notation is a tool of thought and of communication. The clearest example of infix botching both is probably perl style regex.
Postfix is interesting in forth. It makes the stack manipulations very easy to reason about, and the stack is very important there so this looks like a win. The cost is in coherently expressing complex functions, hence the advice to keep words simple. The forth programmers are doing register allocation interwoven with the domain logic.
Lisp makes semantics very easy to write down and obfuscates the memory management implied. No thought goes on register allocation but neither can you easily talk about it.
Discarding the lever of syntactic representation is helpful for communication and obstructive to cognition. See also macros.
~ % dc -v
dc 6.5.0
Copyright (c) 2018-2023 Gavin D. Howard and contributors
Report bugs at: https://git.gavinhoward.com/gavin/bc
This is free software with ABSOLUTELY NO WARRANTY.
~ % dc
3 _ 2 ^ p
9
_3 2 ^ p
9
3 2 ^ _ p
-9
5 _ p
-5
_5 p
-5
(control-D)
The version that I have appears to have _ parsed as an operator in addition to the negation of a numeric constant.