Pharo Smalltalk 中如何实现二进制消息的优先级?

How is precedence of binary messages implemented in Pharo Smalltalk?

我正在查看 Pharo Smalltalk 的语法,想知道二进制消息的优先级是如何实现的。

如何声明这样的二进制消息?

系统如何确定一元消息的优先级?

用于实现二进制消息:

是的,您可以查看数字 class 例如。那里有很多二进制消息。或者考虑这种 Object:

的方法
-> anObject
    ^ Association basicNew key: self value: anObject

这允许您评估 'five' -> 5 并获得关联。

优先级:

这是由解析器完成的。所以首先它寻找关键字消息,然后是二进制,然后是一元,然后是 parents.

所以如果你有

collection add: 'five' -> 5

解析器将首先用接收者collection解析add:,然后解析'five' -> 5并将其作为add:的参数。这样 AST 以关键字消息更通用的方式组成,并将在计算其属性后执行

在哪里可以找到

在最新版本的 Pharo 中,解析是使用 RBParser 完成的(与之前用于重构的解析器相同)。关键字消息用 parseKeywordMessage 解析,二进制用 parseBinaryMessage 解析。探索的简单方法是在 parseBinaryMessage 上设置一个一次性断点并执行类似

的操作
RBParser parseExpression: 'coll add: #five -> 5'

调试器将在 parseBinaryMessage 停止,因此您可以查看堆栈并了解它是如何工作的。注意,break once 很重要,不然每次编译一个方法什么的都会得到一个调试器

在 Smalltalk 中,所有二进制消息都具有相同的优先级,并且严格从左到右求值。这就是为什么

1 + 2 * 3

计算为 9 而不是 7,被计算为

(1 + 2) * 3

所有一元消息都具有相同的优先级,并从左到右计算。它们的优先级高于二进制消息:

1 sin sqrt + 1 cos sqrt

相当于

((1 sin) sqrt) + ((1 cos) sqrt)