我正在研究Pharo Smalltalk的语法,并想知道如何实现二进制消息的优先级。
如何宣布这样的二进制消息?
系统如何确定优先于一元消息?
答案 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)