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

时间:2017-01-11 07:44:28

标签: pharo

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

如何宣布这样的二进制消息?

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

2 个答案:

答案 0 :(得分:6)

用于实现二进制消息:

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

-> anObject
    ^ Association basicNew key: self value: anObject

这使您可以评估'five' -> 5并获得关联。

优先顺序:

这是由解析器完成的。首先,它会查找关键字消息,然后是二进制,然后是一元,然后是父母。

所以,如果你有

collection add: 'five' -> 5

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

在哪里找到

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

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

调试器将在parseBinaryMessage停止,这样您就可以查看堆栈并了解它是如何工作的。注意,打破一次很重要,否则每次编译方法时都会得到一个调试器。

答案 1 :(得分:2)

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

1 + 2 * 3

评估为9而非7,评估为

(1 + 2) * 3

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

1 sin sqrt + 1 cos sqrt

相当于

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