执行代码
Do it(执行代码) Ctrl + D / Cmd + D ,用于执行表达式
Print it(打印结果) Ctrl + P / Cmd + P ,用于打印表达式结果
Inspect it(对象检查器) Ctrl + I / Cmd + I ,用于查看对象内部结构
数值类型
1, 2, 100, 2/3 …这些都是数字,数字可以响应很多消息用于计算各种数学表达式
| 1 | 2. | 
字符类型
字符使用 $ 操作符
| 1 | $A. | 
我们可以打印256个Ascii字符
| 1 | Character allByteCharacters. | 
字符串类型
字符串是一个字符集合,使用 ' 单引号将字符集合括起来即可
| 1 | 'ProfStef'. | 
我们可以使用 at: 消息来访问字符串中的任意字符
| 1 | 'ProfStef' at: 1. | 
字符串拼接可以使用 , 操作符
| 1 | 'ProfStef', ' is cool'. | 
符号类型
符号是保证全局唯一的字符串。只有一个 #Symbol 符号对象,但是可以有多个 'Symbol' 字符串对象
(Message == returns true if the two objects are the SAME)
| 1 | 'ProfStef' asSymbol. | 
数组类型
静态数组在解析期间被创建
| 1 | #(1 2 3). | 
动态数组在执行期间被创建
| 1 | { (2+3) . (6*6) }. | 
消息
消息会被发送给对象,在Smalltalk中有三种类型的消息:一元 unary 、二元 binary 和关键字 keyword
一元 Unary 消息的形式: anObject aMessage
  | 1 | 1 class. | 
二元 Binary 消息的形式: anObject + anotherObject
  | 1 | 3 * 2. | 
关键字 Keyword 消息的形式: anObject akey: anotherObject akey2: anotherObject2
  | 1 | 4 between: 0 and: 10. | 
  这个是将 between:and: 消息发送给数字 4
| 1 | 1 max: 3. | 
  这里消息 r:g:b: 是由 Color 类实现的,我们也可以写成下面这种形式
| 1 | Color | 
消息优先级
一元消息会最先执行,接着执行二元消息,最后才会执行关键字消息
- 一元 Unary> 二元Binary> 关键字Keywords
| 1 | 2 + 3 squared. | 
在具有相似优先级的消息之间,表达式从左到右执行
| 1 | -3 abs negated reciprocal. | 
可以使用括号更改求值顺序
| 1 | (2 + 3) squared. | 
传统的数学优先规则不适用于Smalltalk
| 1 | 2 * 10 + 2. | 
这里消息 * 被发送到 2,2 回答 20,然后 20 接收消息 +
| 1 | 2 + 2 * 10. | 
记住,所有消息都遵循一个简单的从左到右的优先规则,没有例外
; 运算符
; 是级联运算符,在向同一个接收者发送消息时非常有用
| 1 | Transcript show: 'hello'. | 
这段代码等价于下面的写法
| 1 | Transcript | 
块
块 Blocks 是匿名方法,可以存储到变量中并在需要的时候才执行
块被包含在一对方括号中: []
| 1 | [:x | x+2]. | 
这里有一个块,功能是对传入的参数做加2操作(这里的参数被命名为 x ),这里并不会真的执行块
| 1 | [:x | x+2] value: 5. | 
当我们想执行块的时候,需要向块发送 value 消息
| 1 | [:x | x+2] value: 10. | 
块可以分配给变量,并延迟执行
通过 | b | 来声明变量 b,并使用 := 操作符来为变量赋值
| 1 | |b| | 
条件分支
条件语句只是给布尔对象发送消息
| 1 | 1 < 2 | 
这里的消息是 ifTrue:ifFalse:
| 1 | 3 > 10 | 
循环
循环是高级集合迭代器,作为常规方法实现
| 1 | to:do: | 
标准循环写法:
| 1 | 1 to: 100 do: [:i | Transcript show: i asString; cr]. | 
消息 do: 被发送到集合对象( Array 、 Set 、 OrderedCollection ),为每个元素计算块
| 1 | #(11 38 3 -2 10) do: [:each | | 
除了 do: 之外,还有许多其他好用的迭代器
| 1 | #(11 38 3 -2 10) collect: [:each | each abs]. | 
对象
对象是一个类的实例。通常,我们将 new 消息发送给类来创建一个对象实例
| 1 | SimpleButtonMorph new | 
如果向类发送 allInstances 消息,类将回应一个包含该类所有实例的数组
| 1 | SimpleButtonMorph allInstances size. | 
反射
你可以在运行时检查和更改系统
查看 True 类的方法 ifFalse:ifTrue: 的源码
| 1 | (True>>#ifFalse:ifTrue:) definition. | 
也可以查看注释
| 1 | (True>>#ifFalse:ifTrue:) comment. | 
使用 respondsTo 检查是否能够响应消息
| 1 | ProfStef respondsTo: #goToNextLesson. | 
删除一个方法
| 1 | ProfStef class removeSelector: #goToNextLesson. | 
Pharo环境
Pharo是一个完整的环境,拥有诸如:窗口、文本、数字、日期、颜色、点等等。与其他编程语言相比,您可以更直接地与对象交互
每个对象都理解消息 inspect ,因此,你将获得一个Inspector窗口,该窗口可以显示有关对象的详细信息
| 1 | Date today inspect. | 
调试Debugger
调试器可能是Smalltalk环境中最著名的工具。一旦发生异常它将立即打开。
下面的代码将打开消息堆栈上的调试器,选择 PharoSyntaxTutorial>>dividetwoyzero
| 1 | PharoSyntaxTutorial new divideTwoByZero. |