Small:中的“:=”和二进制消息优先级

时间:2013-03-06 23:46:21

标签: programming-languages smalltalk squeak seaside

我正在尝试通过Dolphin Smalltalk X6附带的教程学习Smalltalk。

我的问题涉及对包含多条消息的表达式的评估。

我的理解是首先评估简单消息,然后评估二进制消息,最后评估关键字消息(括号中的代码除外)。但是,我无法将此理解应用于以下示例中的第二行(在Dolphin Smalltalk tutorial中找到)。

    playground := Playground new.
    teresa := playground add: Triangle new.       "Misunderstood code"
    teresa class.                                 "Evaluates to 'Triangle'"

如果我的理解是正确的,那么第二行将被评估:

    1. Simple message 'new' sent to Triangle, triangle object as response
    2. Binary message ':=' with parameter 'playground' sent to 'teresa'.
    3. Keyword message 'add:' with parameter 'triangle object' sent to 'teresa'.
    4. teresa class. "evaluates to 'Playground'".

我的误解在于'teresa'如何引用匿名的Triangle对象,而不是'playground'引用的Playground对象。

我已经查阅了Smalltalk评估的第二个解释,提到:=或添加:是特殊情况没有成功,我能想到的唯一其他解释是一个根本的误解。

任何帮助拉直我的帮助?

2 个答案:

答案 0 :(得分:8)

Assignment运算符(:=)不是消息。 (它不会发送到对象,而是表示变量应该设置到一个值)。它的优先顺序是最后的整体。

所以会发生什么:

  1. 简单消息'new'发送到Triangle,三角形对象作为响应
  2. 关键字消息添加:发送到游乐场,并且有一个添加的约定:消息回答添加的对象,这个似乎遵循,因此返回新创建的三角形。
  3. 变量teresa设置为新三角形
  4. 特蕾莎修课。 “评估三角”。

答案 1 :(得分:7)

虽然:=看起来像二进制消息,因为它使用中缀字符......但事实并非如此。它是语言句法的一部分,与parens和句点相同(例如)。

想一想:=作为赋值运算符(有时称为“获取”)。它不是任何优先级的消息。它会在任何消息发送后进行评估。它的左值必须是直接变量引用(不是消息发送的结果)。