我是 Smalltalk 的新手,令我印象深刻的是该语言只有 6 个关键字(
self
、super
、true
、false
、nil
和 thisContext
) ,以及几乎所有内容都作为消息传递的纯粹性,例如。使用 whileTrue
循环,使用 ifTrue
if/else 等等...这与我在其他语言中习惯的方式有很大不同。
然而,在某些情况下,我只是无法理解消息传递如何真正融入其中,其中包括:
:=
;
.
#( ... )
这些不是消息传递,对吧?
正如您所发现的,仍然有一些实际的 Smalltalk 语法。块构造、文字字符串/符号/注释、局部变量声明 (
|...|
) 和返回 (^
) 是一些你没有提到的东西,它们也是语法。
一些扩展(例如
#(...)
,通常创建一个 Array
,而不是集合)当然可以用其他方式表达,例如 #(1 2 3)
相当于 Array with: 1 with: 2 with: 3
;它们只是为了让代码更容易阅读和编写。
有一点可能有助于澄清:
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,并且有序列、赋值、 返回和级联。它有零个参数和一个参数块。”