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

Sle*_*der 4 smalltalk numeric squeak

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

如下代码

3 + 3 * 2
Run Code Online (Sandbox Code Playgroud)

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


但是当我开始尝试功率计算时,就像

91 raisedTo: 3 + 1. 
Run Code Online (Sandbox Code Playgroud)

我认为答案应该是753572

我实际得到的是68574964

为什么?

是因为它+, -, *, /比权力更优先吗?

Lea*_*lia 6

是的,+,-,*,/有超过优先级raisedTo:,并在此有趣的方面是,为什么出现这种情况的原因.

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

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

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

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

(91 raisedTo: 3) + 1
Run Code Online (Sandbox Code Playgroud)

将先评估raisedTo:然后评估+.请注意,你可以写

91 raisedTo: (3 + 1)
Run Code Online (Sandbox Code Playgroud)

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


常用的二进制选择器

@Point为创建消息x @ y

>= 大于或等等

->Association对消息key -> value

==> PetitParser使用的生产转换

= 等于

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

~= 不平等

~~ 不一样

\\ 剩余

//

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


Uko*_*Uko 6

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

他们是:

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

一元消息优先于二进制,它们都优先于关键字消息.换一种说法:

unary > binary > keyword
Run Code Online (Sandbox Code Playgroud)

所以举个例子

5 raisedTo: 7 - 2 squared = 125
Run Code Online (Sandbox Code Playgroud)

因为第一个一元2 squared被评估得到4,所以二进制7 - 4被评估得到3,最后关键字5 risedTo: 3评估为125.

当然,括号中所有内容的优先级最高.

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