gnu smalltalk 教程-基本操作

假设已安装好gnu smalltalk
进入gun stmalltalk交互环境非常简单,只需要

gst
GNU Smalltalk ready
st>

很好,你已经进入了gst的交互环境。如果要退出,在新的一行输入ctrl+D

按照惯例,我们来让程序输出hello world

'Hello world' printNl
'hello,world'
'hello,world'

实际的程序只有一句

1
'Hello world' printNl

但是为什么会有两个输出呢?其中的第一个便是我门要求的输出,而第二个是环境的返回值(snipped evaluated),我门可以在运行gst的时候在后面加上-V选项,这样会输出更详细的环境返回值。

gst -V
GNU Smalltalk ready
 
st> 'Hello world' printNl
'Hello world'
1426 byte codes executed
which took 0.000 seconds (0.000s user+0.000s sys)
66 primitives, percent 4.63
self returns 2, inst var returns 0, literal returns 0
127 method cache lookups since last cleanup, percent 8.91
60 method cache hits, 67 misses, 47.24 percent hits
returned value is 'Hello world'

很容易发现,第二个返回值变得更加详细了。
了解完基本的操作,现在让我们来看看这句程序做了什么

'Hello world' printNl

这句代码做了两件事. 1创建了一个包含了Hello world的字符串对象。2给字符串对象发送了一个名为printNl的消息。当对象处理完printNl消息后,我们得到了提示返回。你应当注意到这里没有提到任何如何输出字符串的细节,这是有意为之的:我们输入的代码并不知道任何关于输出的事情,它仅仅是创建了一个对象,然后给这个对象发送一个消息,这就是这句代码的全部。
为了更有趣一点。让我们看看当字符串对象接收到printNl消息时发生了什么。字符串对象回去查找一个表,看看那里可以接收指定的消息,从而决定运行什么代码。printNl对应的代码输出了字符串的内容。
输出数字
同样也可以把printNl消息发送到数字

-2.45e8 printNl

不过这样怎么看也不想程序,仅仅只有一行。当然gst支持多行处理

(-2.45e8
printNl)

不过在交互模式下可能令人困惑,应为前面的prompt字符川没有发生任何变化。

 (-2.45e8 
     printNl)
-2.45e8

printNl的用法就暂时说到这里,之后的代码中我们用gst自带的提示星系来了解输出就足够了。

gnu smalltalk中的数学计算
先看一个最简单的

7 + 8

返回值是15.数字型对象7获得一个+消息,这个消息有一个参数,这个参数是数字对象8。数字对象的+消息会创建一个新的数字对象15,然后向这个新的对象15发送printNl消息。于是,我们看到了输出结果。
可见数字运算在smalltalk里并不是一类特殊操作,和其他所有对象一样,仅仅是创建对象,发送消息。
这里有一些例子,可以帮助你的理解。

8 * (4 / 2)
8 - (4 + 1)
2/3 + 7
2 + 3 * 4
2 + (3 * 4)