Squeak Smalltak,+, - ,*,/有更多优先权吗?

时间:2017-11-11 22:06:43

标签: numeric smalltalk squeak

我理解在Smalltalk数值计算中,如果没有圆括号,一切都从左到右开始计算。乘法和除法的规则没有遵循加法和减法的优先顺序。

与以下代码一样

3 + 3 * 2

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

但是当我开始尝试功率计算时,比如

91 raisedTo: 3 + 1. 

我认为答案应该是753572

我实际得到的是68574964

为什么?

是因为+, -, *, /优先于权力吗?

2 个答案:

答案 0 :(得分:6)

是的,String withSpaces = " a b c "; String trimmed = withSpace.trim(); // "a b c" +-*的优先级高于/,有趣的方面就是这种情况发生的原因

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

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

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

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

3 + 1

将首先评估(91 raisedTo: 3) + 1 ,然后评估raisedTo:。请注意,您可以写

+

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

常用二进制选择器

91 raisedTo: (3 + 1) @

Point创建消息

x @ y大于或等于等等。

>= ->

Association条消息 PetitParser使用的

key -> value生产转换

==>等于

=相同(非常相同的对象)

==不等于

~=不相同

~~余下

\\

还有更多。当然,您总是有权创建自己的。

答案 1 :(得分:6)

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

他们是:

  • 一元消息,由单个标识符组成,squaredasString中没有3 squaredorder asString参数;
  • 二进制消息,其选择符由!%&*+,/<=>?@\~-个符号组成,并且在+或{{1}中有一个参数->3 + 4 }};
  • 关键字消息,其中包含一个或多个参数以及带有冒号的选择器,key -> valueraisedTo:中的to:by:do:4 risedTo: 3

一元消息优先于二进制,它们都优先于关键字消息。换句话说:

1 to: 10 by: 3 do: [ … ]

所以例如

unary > binary > keyword

由于评估了第一个一元5 raisedTo: 7 - 2 squared = 125 导致2 squared,因此评估二元4,结果为7 - 4,最后关键字3的计算结果为125。 / p>

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

为了简化对这个概念的理解,不要考虑数字和数学,所有数字都是对象,所有运算符都是消息。原因是5 risedTo: 3并不意味着a + b * cab都是数字。它们可以是人类,汽车,在线商店文章。他们可以定义自己的c+方法,但这并不意味着*(这不是&#34;乘法&#34;,它只是一个&#34;明星消息&#34;)应该在*之前发生。