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] 中的 squared
或 asString
参数=];
- 二进制消息 有一个由
!%&*+,/<=>?@\~-
符号组成的选择器,并且有一个参数作为 +
和 ->
在 3 + 4
或 key -> value
;
- 关键字消息 具有一个或多个参数和一个在每个参数前带有冒号的选择器,如
raisedTo:
和 to:by:do:
in 4 risedTo: 3
和1 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
并不意味着 a
、b
和 c
是数字。他们可以是人、汽车、网上商店的商品。他们可以定义自己的 +
和 *
方法,但这并不意味着 *
(这不是 "multiplication",它只是一个 "star message")应该发生在 +
.
之前
我理解在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] 中的squared
或asString
参数=]; - 二进制消息 有一个由
!%&*+,/<=>?@\~-
符号组成的选择器,并且有一个参数作为+
和->
在3 + 4
或key -> value
; - 关键字消息 具有一个或多个参数和一个在每个参数前带有冒号的选择器,如
raisedTo:
和to:by:do:
in4 risedTo: 3
和1 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
并不意味着 a
、b
和 c
是数字。他们可以是人、汽车、网上商店的商品。他们可以定义自己的 +
和 *
方法,但这并不意味着 *
(这不是 "multiplication",它只是一个 "star message")应该发生在 +
.