Синтаксис Smalltalk довольно прост, если не сказать минималистичен. Сообществом пользователей даже была сделана такая вещь, как синтаксис Smalltalk на открытке (Squeak-сообщество и здесь выделилось - они сделали Squeak Action Card :-) ).
Ключевые слова[]
self
- Cсылка на объект, в контексте которого происходит выполнение (т.е. на "себя"), аналог ключевого словаthis
в C-подобных языках.
super
- Cсылка на "родителя", аналог ключевого словаparent
в C-подобных языках. Это не объект как таковой, а указание, что вызываемый метод надо искать начиная с родительского класса.
Синтаксические элементы[]
.
(точка) - Разделитель выражений. Аналог точки с запятой (;
) в C-подобных языках.:=
(двоеточие и знак "равно", написанные слитно) - Операция присваивания.^
(циркумфлекс) - Возвращает результат из метода, аналог оператораreturn
в C-подобных языках. В Smalltalk любой метод всегда возвращает какое-то значение. Если в методе не используется оператор^
, то метод возвращает значениеself
.| |
(две вертикальные черты) - Заведение локальных переменных. Имена переменных перечисляются между вертикальными чертами. Пример:| var1 var2 |
. Может находиться либо в начале метода, либо в начале блока (в таком случае область видимости переменных - этот блок).[ ]
(квадратные скобки) - Smalltalk-блок. Подробное описание - в отдельной статье.:param
(двоеточие и имя параметра, написанные слитно) - Аргумент (параметр) блока.|
(вертикальная черта) - Конец описания аргументов.
' '
(одинарные кавычки) - Строка. Пример:'This is a string'
. Для того, чтобы использовать одинарную кавычку внутри строки, нужно её удвоить. Пример:'It''s a string'
.#someSymbol
(решётка, записанная слитно со словом) - Так называемый "символ" (объект классаSymbol
)." "
(двойные кавычки) - Комментарий.#( )
- Массив (объект классаArray
). Пример:#( 1 2 )
- массив из двух элементов "1" и "2".#[ ]
- Массив байтов (объект классаByteArray
).( )
- Скобки. Влияют на очерёдность выполнения операций.;
(точка с запятой) - Если требуется выполнить несколько разных методов у одного и того же объекта, то не обязательно указывать этот объект каждый раз - достаточно указать его только один раз и перечислить вызываемые методы через точку с запятой. Некоторый аналог - операторwith
в Pascal-е.
Базовые объекты[]
nil
- объект классаUndefinedObject
. Именно этим объектом инициализируются все переменные. Это синглетон - т.е. объект, существующий в единственном экземпляре.true
- объект классаTrue
, отнаследованного отBoolean
. Синглетон.false
- объект классаFalse
, отнаследованного отBoolean
. Синглетон.
Выражения[]
Выражения в Smalltalk всегда стрятся по принципу: сначала идёт объект, потом метод, который у него вызывается (возможно с параметрами). С учётом приоритетов исполнения это даёт строгий и однозначный синтаксис.
Типы методов[]
В Smalltalk существуют методы трёх типов: унарные, бинарные и "ключевые слова" (keywords).
Унарные методы[]
Унарные методы называются так потому, что они взаимодействуют только с одним объектом - тем, у которого вызываются. Соответственно, у унарных методов нет параметров. Имя унарного метода всегда начинается с маленькой буквы и состоит из больших и маленьких букв, а также цифр.
Примеры:
factorial
в классеInteger
. Например,10 factorial
вернёт3628800
.not
- в классахTrue
иFalse
. Например,true not
вернётfalse
.
Бинарные методы[]
Называются они так потому, что они взаимодействуют с двумя объектами - тем, у которого вызываются и ещё одним, передаваемым в качестве параметра. Соответственно, у них строго один параметр. Имя бинарного метода состоит из одного или двух из следующих символов: + - / \ * ~ < > = @ & ? ,
.
Примеры:
1 + 2
. У объекта1
вызывается метод+
с параметром2
. Вернёт это метод объект3
.100 @ 200
. У объекта100
вызывается метод@
с параметром200
. Вернёт этот метод точку (объект классаPoint
) с координатамиx = 100, y = 200
.'key' -> 123
. У объекта'key'
(т.е. у строки) вызывается метод->
с параметром123
. Результатом будет объект классаAssociation
, причём в качестве ключа будет строка'key'
, а значением будет123
.
Методы - ключевые слова[]
Приоритет исполнения[]
На приоритет исполнения влияет только тип метода - и, разумеется, скобки. Все методы одного типа (например, все бинарные) имеют одинаковый приоритет.