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)
我正在查看 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)