RedTigerFish wrote on Sat, 11 Nov 2017 15:12:06 -0700 (MST)
I understand in Smalltalk numerical calculation, if without round brackets, everything starts being calculated from left to right. Nothing follows the rule of multiplication and division having more precedence over addition and subtraction.
Like the following codes
3 + 3 * 2 The print output is 12 while in mathematics we get 9
You are right. See C for an example of how complicated things can get if you want to have a bunch of precendence rules. And C has a fixed set of such operators while in Smalltalk we can define a bunch of new operators (binary selectors - see below) and then what should the precendence be compared to the existing ones?
So the decision was made to go for simplicity even though that contradicts the goal of not surprising beginners if possible.
But when I started to try power calculation, like
91 raisedTo: 3 + 1. I thought the answer should be 753572
What I actual get is 68574964
Why's that?
Is it because that +, -, *, / have more precedence over power ?
Yes, but the rules are simple and general which should make them easy to learn.
Smalltalk messages have three different forms:
- unary messages are a simple alphanumerical name which follows the expression defining the object which will receive the message:
1.1 sin
4 factorial
- binary messages have names composed entirely of "graphics characters" and the follow the expression defining the receiver and come before the expression defining the single argument:
3 + 4
7 <= 9
Unary selectors have a higher precedence than binary ones, so
3 + 4 factorial
is the same thing as
3 + (4 factorial)
and not
(3 + 4) factorial
- keyword messages have names which are one or more alphanumerical words, each followed by a colon character. The first word comes after the receiver and each colon is followed by an argument:
91 raisedTo: 3
4 between: 1 and: 7
Keyword selectors have the lowest precedence of all, so
91 raisedTo: 3 + 1
is the same as
91 raisedTo: (3 + 1)
and not
(91 raisedTo: 3) + 1
So there are only three simple rules to remember, but even so you will often see code which uses more parenthesis (curved brackets) than needed just to make sure.
One ugly part of Smalltalk syntax is that though "-" is a binary message the same character is used for negative literal numbers.
2-1
returns 1.
2 -1
also returns 1.
2 * -1
returns -2,
2 *-1
is a syntax error with a dialog asking you to fix it.
2*-1
same thing.
With all that, we can mix all three kinds of selectors:
91 raisedTo: 3 + -1 abs
also returns 68574961.
-- Jecel