Smalltalk 中的消息传递真的都是这样吗?

问题描述 投票:0回答:2

我是 Smalltalk 的新手,令我印象深刻的是该语言只有 6 个关键字(

self
super
true
false
nil
thisContext
) ,以及几乎所有内容都作为消息传递的纯粹性,例如。使用
whileTrue
循环,使用
ifTrue
if/else 等等...这与我在其他语言中习惯的方式有很大不同。

然而,在某些情况下,我只是无法理解消息传递如何真正融入其中,其中包括:

  • 赋值运算符
    :=
  • 级联运算符
    ;
  • 周期运算符
    .
  • 创建集合的方法
    #( ... )

这些不是消息传递,对吧?

smalltalk
2个回答
13
投票

正如您所发现的,仍然有一些实际的 Smalltalk 语法。块构造、文字字符串/符号/注释、局部变量声明 (

|...|
) 和返回 (
^
) 是一些你没有提到的东西,它们也是语法。

一些扩展(例如

#(...)
,通常创建一个
Array
,而不是集合)当然可以用其他方式表达,例如
#(1 2 3)
相当于
Array with: 1 with: 2 with: 3
;它们只是为了让代码更容易阅读和编写。


2
投票

有一点可能有助于澄清:

self
super
true
false
nil
thisContext
是数据原语,而不是关键字。

它们是仅有的 6 个数据原语。这 6 个变量也称为“伪变量”。绝对所有其他事物都是类对象或其子类的实例。 Smalltalk 中预定义的关键字很少。它们可以写成非常简洁的形式。

一个著名的例子是

明信片上的 Smalltalk 语法(链接)

exampleWithNumber: x | y | true & false not & (nil isNil) ifFalse: [self halt]. y := self size + super size. #($a #a "a" 1 1.0) do: [ :each | Transcript show: (each class name); show: ' ']. ^x < y

这是此方法的注释 - 比方法本身还要大:

“一种说明 Smalltalk 方法语法每个部分的方法 除了原语。它有一元、二进制和键盘消息, 声明参数和临时变量,访问全局变量 (但不是实例变量),使用文字(数组、字符、 符号、字符串、整数、浮点数),使用伪变量 true、false、nil、self 和 super,并且有序列、赋值、 返回和级联。它有零个参数和一个参数块。”

© www.soinside.com 2019 - 2024. All rights reserved.