【问题标题】:":=" and binary message precedence in SmalltalkSmalltalk 中的 ":=" 和二进制消息优先级
【发布时间】:2013-02-22 00:23:57
【问题描述】:

我正在尝试通过 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 评估的第二种解释,其中提到了 := 或 add: 是没有成功的特殊情况,而我能想到的唯一其他解释是根本性的误解。

有什么可以帮我理顺的吗?

【问题讨论】:

    标签: programming-languages smalltalk squeak seaside


    【解决方案1】:

    虽然 := 看起来像一个二进制消息,因为它使用中缀字符……但它不是。它是语言语法的一部分,就像括号和句点一样(例如)。

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

    【讨论】:

      【解决方案2】:

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

      那么会发生什么:

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

      【讨论】:

      • 让人想知道为什么 := 在 Smalltalk 中不是一条消息。为什么不让变量接收 := ?
      • 因为变量实际上是指向对象的指针,它不是对象本身。消息被发送到变量指向的对象,而 := 运算符更改变量指向的对象。
      • hmm 对象指针不是对象,因此它们无法接收 := (或 pointTo: anObject,或 →)
      • @Hendekagon 动态语言在 Smalltalk 中继承了很多传统,实际上就是这样做的。自我(有时称为 Smalltalk 之子)可以。 Python 也允许调整赋值的操作方式。可能其他人也一样。我曾经为 VisualWorks 制作了一个具体的 Slots 原型,除其他外,它会添加一个钩子,用于任意调整 set/access to a variable slot。
      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 2012-09-04
      • 2015-12-23
      • 1970-01-01
      • 2015-02-11
      • 2014-05-25
      相关资源
      最近更新 更多