Smalltalk по-русски

Синтаксис 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.

Методы - ключевые слова[]

Приоритет исполнения[]

На приоритет исполнения влияет только тип метода - и, разумеется, скобки. Все методы одного типа (например, все бинарные) имеют одинаковый приоритет.