Pull to refresh

Заметка о синтаксисе Smalltalk

Reading time3 min
Views2K
image
Всем привет!

В комментариях к топику народ интересовали фирменные фитчи языка Smalltalk. Этой заметкой хотелось бы немного раскрыть комментарийпользователя mou и главный акцент сделать на простоту языка.

Для того, чтобы программировать с использованием языка Smalltalk достаточно знать 2 понятия:
  • абсолютно все является экземпляром какого-либо класса
  • экземпляру класса можно послать сообщение

Кроме того, можно послать сообщение самому классу, так как класс, в свою очередь, также является экземпляром (Курица или яйцо?).
Необходимо отметить, что в языке поддерживаются:
  • операция присваивания (:=)
  • операция возврата результата (^)
  • блок объявления переменных (|<переменная_1> <переменная_2>|)
  • шаблон создания массива значений (#(объект_1 объект_2))
  • блок кода ([ :<переменная>| <набор инструкций>])

С помощью механизма посылки сообщений реализуются все привычные для языков программирования операции: циклы, условные переходы и т.д.
Сообщения, посылаемые объекту (экземпляру класса) могут быть трех видов:
  • Унарные
    объект сообщение
    Пример: #('массив' 'из' 'строк') size
    — экземпляру класса Array посылается сообщение size, метод обработки которого вернет размер получателя сообщения. В данном случае получателем сообщения является #('массив' 'из' 'строк'), а метод обработки сообщения size вернет значение 3.
  • Бинарные
    объект сообщение объект-аргумент
    Пример: 10 - 5
    — экземпляру класса SmallInteger – 10 посылается сообщение - (минус), с одним аргументом – экземпляром класса SmallInteger – 5. Метод обработки сообщения - (минус) вернет разницу между получателем (10) и аргументом (5). Следует отметить, что получателем сообщения может быть результат выполнения какой-либо операции. Так в выражении 6 - 2 * 3 получателем сообщения * будет результат операции 6 - 2 и в качестве ответа на сообщение * вернет 12, а не 0, как можно было бы предположить. Для того чтобы изменить порядок вычислений, следует использовать скобки, что позволит рассматривать выражение внутри скобок как аргумент сообщения, стоящего перед ним. Сообщения данного типа обязательно должны состоять из одного или двух специальных символов (+, =, !=, //, \\ и т.д.).
  • Ключевые
    объект кл_слово_сообщ_1: объект-аргумент [кл_слово_сообщ_n: объект-аргумент]
    Пример: Transcript show: ‘Hello!’
    Пример: CwTextPrompter prompt: 'Ваше имя?' answer: 'Александр' title: 'Вопрос...'
    — сообщение представляет собой набор ключевых слов в строго определенном порядке. Ключевые слова отделяются знаком двоеточия, а после каждого ключевого слова должен следовать объект-аргумент. Так в первом примере сообщение состоит всего из одного ключевого слова show, после которого следует строка – объект-аргумент. Сообщение второго примера состоит из трех ключевых слов: prompt: answer: title:, набор ключевых слов в определенном порядке и есть сообщение. Рекомендуется располагать слова в сообщении так, чтобы при записи сообщения вместе с объектами-аргументами, выражение читалось как предложение на естественном языке.


В качестве примера приведу метод обработки бинарного сообщения * производящего умножение матрицы-приемника на матрицу-аргумент:

* rcMatrix
  "Выполняет перемножение матриц"

  "Объявление переменных"
  | r |
  "Присваивание переменной r результата посылки сообщения new:with: класса RCMatrix"
  r := RCMatrix new: (self rowsCount) with: (rcMatrix columnsCount).
  
  "Обнуление матрицы"
  1 to: (self rowsCount) do:
  [:i |
    1 to: (rcMatrix columnsCount) do:
    [:j |
      r at: i at: j put: 0.
    ].
  ].

  "Перемножение"  
  1 to: (self rowsCount) do:
  [:i |
    1 to: (rcMatrix columnsCount) do:
    [:j |
      1 to: (rcMatrix rowsCount) do:
      [:k |
        r at: i at: j put:
          ((r at: i at: j) +
          ((self at: i at: k) * (rcMatrix at: k at: j))).
      ].
    ].
  ].

  "Возврат результата"  
  ^r.


* This source code was highlighted with Source Code Highlighter.


Спасибо за внимание к заметке.
Tags:
Hubs:
Total votes 19: ↑19 and ↓0+19
Comments9

Articles