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
为什么?
是因为它+, -, *, /比权力更优先吗?
是的,+,-,*,/有超过优先级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使用的生产转换
= 等于
== 相同(非常相同的对象)
~= 不平等
~~ 不一样
\\ 剩余
// 商
还有更多.当然,您始终有权创建自己的.
Smalltalk没有优先级的运算符.相反,有三种不同的消息.每种都有自己的优先权.
他们是:
squared或者asString在3 squared或中order asString;!%&*+,/<=>?@\~-符号组成,并且具有一个参数as +和->in ; 3 + 4或key -> value;raisedTo:和to:by:do:在4 risedTo: 3和1 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,b和c是数字.它们可以是人类,汽车,在线商店文章.他们可以定义自己+和*方法,但这并不意味着*(这不是"乘法",它只是一个"星号消息")应该发生在之前+.