Squeak Smalltalk,+、-、*、/ 是否比功率更优先?

Squeak Smalltak, Does +, -, *, / have more precedence over power?

我理解在Smalltalk的数值计算中,如果没有圆括号,一切都是从左到右开始计算的。没有什么比加法和减法更优先于乘法和除法的规则了。

喜欢以下代码

3 + 3 * 2

打印输出是 12 而在数学中我们得到 9


但是当我开始尝试功率计算时,喜欢

91 raisedTo: 3 + 1. 

我认为答案应该是 753572

我实际得到的是68574964

这是为什么?

是不是因为 +, -, *, / 比 power 更优先?

是的,+-*/raisedTo: 有更多的优先级,有趣的是这就是为什么发生这种情况。

在Smalltalk 中有三种类型的消息:一元、二进制和关键字。在我们的例子中,+-*/ 是二进制消息的示例,而 raisedTo: 是关键字消息。您可以看出这一点,因为二进制消息是由非字母或数字的字符组成的,这与一元或关键字不同,后者以字母或下划线开头,然后是数字、字母或下划线。此外,您可以判断选择器何时是一元的,因为它们不以冒号结尾。因此,raisedTo: 是关键字消息,因为它以冒号结尾(并且不是由非字母或数字符号组成)。

因此,表达式 91 raisedTo: 3 + 1 包含两个选择器,一个二进制 (+) 和一个关键字 (raisedTo:) 并且优先规则为:

首先评估一元消息,然后是二进制消息,最后是带有关键字的消息

这就是 3 + 1 首先被评估的原因。当然,您始终可以使用括号更改优先级。例如:

(91 raisedTo: 3) + 1

将首先评估 raisedTo:,然后 +。请注意,您可以写

91 raisedTo: (3 + 1)

也是。但通常不会这样做,因为 Smalltalk 优先级规则很容易记住,您不需要强调它们。


常用二元选择器

@ Point 创建消息 x @ y

>=大于等于等

-> Association 消息 key -> value

==> PetitParser 使用的生产转换

=等于

== 相同(完全相同的对象)

~=不等于

~~ 不相同

\余数

//

还有更多。当然,您始终有权创建自己的作品。

Smalltalk 没有优先级运算符。相反,存在三种不同类型的消息。每种都有自己的优先级。

他们是:

  • 一元消息,由单个标识符组成,没有 3 squared 或 [=15] 中的 squaredasString 参数=];
  • 二进制消息 有一个由 !%&*+,/<=>?@\~- 符号组成的选择器,并且有一个参数作为 +->3 + 4key -> value;
  • 关键字消息 具有一个或多个参数和一个在每个参数前带有冒号的选择器,如 raisedTo:to:by:do: in 4 risedTo: 31 to: 10 by: 3 do: [ … ].

一元消息优先于二进制消息,并且它们都优先于关键字消息。也就是说:

unary > binary > keyword

例如

5 raisedTo: 7 - 2 squared = 125

因为第一个一元 2 squared 的计算结果为 4,然后二进制 7 - 4 的计算结果为 3 最后关键字 5 risedTo: 3 的计算结果为 125 .

当然,括号的优先级最高。

为了简化对这个概念的理解,不要考虑数字和数学,所有数字都是对象,所有运算符都是消息。原因是 a + b * c 并不意味着 abc 是数字。他们可以是人、汽车、网上商店的商品。他们可以定义自己的 +* 方法,但这并不意味着 * (这不是 "multiplication",它只是一个 "star message")应该发生在 +.

之前