Smalltalk по-русски
Advertisement
2.0

Синтаксис предложения[]

Глава 1 вводит фундаментальные концепции системы Смолток. Компоненты системы представляются объектами. Объекты это экземпляры классов. Объекты взаимодействуют посредством посылки сообщений. Сообщения вызывают методы для выполнения. Данная глава вводит синтаксис предложения для описания объектов и сообщений. Следующая глава вводит синтаксис для описания классов и методов.

Выражение это последовательность символов которая описывает объект называемый значением выражения. Синтаксис представленный в данной главе объясняет какие последовательности символов образуют разрешённые последовательности. В языке Смолток есть четыре типа выражений.

  1. Литералы описывают некоторые объекты константы, такие как числа и цепи знаков.
  2. Имена переменных описывают доступные переменные. Значение имени переменной это текущее значение переменной с данным именем.
  3. Предложение сообщение описывает сообщение к получателю. Значение сообщения определяется методом вызываемым сообщением. Этот метод находится в классе получателя.
  4. Предложение блок описывает объект представляемый отложенные действия. Блоки используются для реализации управляющих конструкций.

Предложения встречаются в двух местах, в методах и в тексте выводимом на экран. Когда посылается сообщение выбирается метод из класса получателя и его предложения выполняются. Интерфейс пользователя позволяет выделить предложение на экране и выполнить его. Детальное описание способов выделения и выполнения предложений на экране выходит за рамки данной книги, т.к. это часть интерфейса с пользователем. Однако некоторые примеры приведены в главе 17.

Из четырёх типов выражений представленных выше только имена переменных зависят от контекста. Положение выражения в системе определяет какие последовательности букв являются допустимыми для имён переменных. Набор имён переменных доступный в предложениях метода зависит от класса в котором находится метод. Например, методы в классе Прямоугольник и методы в классе Точка имеют доступ к различным наборам имён переменных. Переменные доступные методам класса будут полностью описаны в Главах 3, 4 и 4. Имена переменных доступные для предложений на экране зависят от того где предложение выведено на экран. Все остальные стороны синтаксиса предложений не зависят от положения предложения.

Синтаксис выражений собран в диаграмме которая помещена на задней обложке данной книги. Оставшаяся часть данной главы описывает четыре типа предложений.

Литералы[]

Пять типов объектов могут быть обозначаться выражениями литералами. Т.к. значение выражения литерала всегда один и тот же объект, эти выражения также называются литералами константами. Пять типов литералов констант включают:

  1. числа
  2. индивидуальные знаки
  3. цепочки знаков
  4. символы
  5. ряды других литералов констант

Числа[]

Числа это объекты которые представляют численные значения и отвечают на сообщения которые вычисляют математические выражения. Литеральное представление числа это последовательность цифр, которая может предваряться знаком минус, или/и следующей десятичной точкой и другой последовательность цифр. Например:

3

30.45

-3

0.005

-14.0

13772

Литералы числа также могут быть представлены в недесятичной системе счисления путём предшествующих цифр в приставке основания. Приставка основания включает значение числа основания (всегда записывается в десятичной системе) и последующую букву «r». Следующие примеры определяют числа в восьмеричной системе счисление с соответствующими им десятичными значениями.

восьмеричные десятичные
8o377 255
8o153 107
8o34.1 28.125
-8o37 -31

Когда основание больше десяти, тогда для цифр больших девяти используются заглавные буквы начиная с «А». Следующие примеры определяют числа в шестнадцатеричной системе счисления вмести с соответствующими десятичными числами.

шестнадцатиричные десятичные
16o106 262
16oЕЕ 255
16oАВ.ГВ 172.859
-16o1.В -1.75

Числа также могут быть записаны в научной форме с цифрами обозначающими экспоненциальный суффикс. Экспоненциальный суффикс включает букву «э» с последующим значением экспоненты (записанном в десятичной системе). Число записанное перед суффиксом умножается на основание возведённое в степень экспоненты.

научная запись десятичное значение
1.586e5 158600.0
1.586e-3 0.001586
8o3e2 192
2o11e6 192

Знаки[]

Знаки это объекты которые представляют символы алфавита. Выражение литерала знака содержит знак доллара и следующий знак, например,

$a
$M
$-
$$
$1

Цепи[]

Цепи это объекты которые представляют последовательности знаков. Цепочки отвечают на сообщения которые дают доступ к отдельным знакам, заменяют подцепочки и производят сравнения с другими цепочками. Литеральное представление цепочки это последовательность знаков отделённая одинарными кавычками, например,

‘hi’
‘food’
‘the Smalltalk-80 system’

Любой знак может быть включён в литерал. Если одинарная кавычка включается в цепочку, то чтобы не спутать её с отделителем нужно записать кавычку дважды. Например литерал цепочка 'can"t' ссылается на цепочку из пяти знаков $c, $a, $n, $’ и $t.

Символы[]

Символы это объекты которые представляют собой цепочки используемые в системе для именования. Литеральное представление символа это последовательность букв и цифр с предшествующим знаком #, например,

#bill
#M63

Никогда не будет два символа с одинаковыми знаками, каждый символ уникален. Это позволяет сравнивать эффективно символы.

Ряды[]

Ряд это простая структура данных на чьё содержание можно ссылаться с помощью целых номеров от одного до числа которое является размером ряда. Ряды отвечают на сообщения запрашивающие доступ к их содержимому. Литеральное представление ряда это последовательность других литералов – чисел, знаков, цепочек, символов и рядов - отделённая скобками и предшествующим знаком #. Другие литералы разделяются пробелом. Внутренним символам и рядам не предшествует знак #. Ряд из трёх чисел описывается выражением

  1. ( 1 2 3 )

Ряд из семи цепочек описывается выражением

  1. ('food' 'utilities' 'rent' 'household' 'transportation' 'taxes' 'recreation')

Ряд из двух рядов и двух чисел описывается выражением

  1. ( ( 'one' 1 ) ( 'not' 'negative' ) 0 -1 )

И ряд из числа, строки, знака, символа и другого ряда описывается выражением

  1. ( 9 'nine' $9 nine ( 0 'zero' $0 ( ) 'e' $f 'g' $h 'i' ) )

Переменные[]

Память доступная объекту состоит из переменных. Большинство из этих переменных имеет имя. Каждая переменная запоминает один объект и имя переменной может быть использовано как выражение ссылающиеся на этот объект. Объекты к которым можно получить доступ в данном месте определяются тем какие имена переменных доступны. Например, контекст переменных экземпляра объекта недоступен для других объектов из за того что эти переменные могут быть использованы только в методах класса объекта. Имена переменных это простой идентификатор, последовательность букв и цифр начинающаяся с буквы. Некоторые примеры имён переменных:

номер
начальный номер
редактор текста
Домашние финансы
Прямоугольник
Источник поступления

В системе существует два вида переменных, отличающихся частотой доступа к ним. Индивидуальные переменные доступные только одному объекту. Переменные экземпляра индивидуальны. Разделяемые переменные могут быть доступны более чем одному объекту. Имена индивидуальных переменных должны начинаться с маленькой буквы, имена разделяемых переменных должны начинаться с большой буквы. Первые три примера идентификаторов показных выше ссылаются на индивидуальные переменные а последние три ссылаются на разделяемые переменные.

Другое соглашение по использованию заглавных букв использованное в примере – идентификаторы образованные из соединённых слов используют большую букву в начале каждого слова следующего за первым. Выполнение этого соглашения система не требует.

Присваивания[]

Константа литерал всегда ссылается на один и тот же объект, но имя переменной в разное время может ссылаться на различные объекты. Объект на который ссылается переменная изменяется во время выполнения выражения присваивания. Присваивание не было упомянуто ранее как один из типов выражений из за того что любое выражение может стать присваиванием если к нему добавить приставку присваивание.

Приставка присваивание состоит из имени переменной чьё значение будет изменяться и стрелки влево (в 1970 годах на клавиатуре была кнопка для ввода символа стрелка влево затем на том же месте вместо стрелки стали использовать символ подчёркивания, поэтому везде где упоминается стрелка влево стоит символ подчёркивания). Следующий пример это выражение литерал с приставкой присваиванием. Оно показывает что переменная количество должна сейчас ссылаться на объект представляемый числом 19.

количество19.

Следующий пример это выражение переменная с приставкой присваивания. Он показывает что переменная номер должна ссылаться на тот же объект что и переменная начальный номер.

номерначальный номер.

Другой пример присваивания:

имя главы‘Синтаксис выражения’.
flavors#( ‘vanilla’ ‘chocolate’ ‘butter pecan’ ‘garlic’)

Можно добавлять более чем одну приставку присваивание, это показывает что будет изменено значение более чем одной переменной.

номерначальный номер1

Это выражение показывает что обе переменные номер и начальный номер должны ссылаться на число 1. Выражение сообщение и выражение блок могут также иметь приставку присваивание, как будет видно в следующих разделах.

Имена псевдопеременные[]

Имена псевдопеременные это идентификаторы которые ссылаются на объект. С этой стороны они подобны именам переменных. Имя псевдопеременной отлично от имени переменной в том что её значение невозможно изменить при помощи выражения присваивания. Некоторые из псевдопеременных это константы, они всегда ссылаются на один и тот же объект. Три важные псевдопеременные это nil, true и false.

nil – ссылается на объект используемый как значение переменной когда нет другого подходящего объекта. Переменные которые не были инициализированы ссылаются на пусто.

true – ссылается на объект который представляет логическую истинность. Она используется как положительный ответ на сообщение с вопросом требующим подтверждения да-нет.

false – ссылается на объект который представляет логическую ложность. Она используется как отрицательный ответ на сообщение с вопросом требующим подтверждения да-нет.

Объекты именуемые истина и ложь называются Логическими объектами. Они представляют ответ на вопрос требующий ответа да-нет. Например, число должно отвечать истина или ложь на сообщение спрашивающие больше ли число чем другое число. Логические объекты отвечают на сообщения которые вычисляют логические функции и выполняют условные управляющие конструкции.

В системе существую другие псевдопеременные (например self и super) чьи значения зависят от того где они используются. Это будет описано в следующих трёх главах.

Сообщения[]

Сообщения представляют взаимодействие между компонентами системы Смолток. Сообщение запрашивает операцию для части получателя. Некоторые примеры выражений сообщений и взаимодействий которые они представляют:

Сообщения к числа представляют арифметические операции.

3 + 4 - вычисляет сумму трёх и четырёх.

number + 1 - добавляет единицу к числу с именем number.

number > limit - спрашивает является ли число с именем number больше чем число с именем limit.

theta sin - вычисляет синус числа с именем theta.

number sqrt - вычисляет корень положительного числа с именем number.

Сообщения к линейным структурам данных представляют добавление или удаление информации.

список добавить первым: новый компонент - добавляет объект именуемый новый компонент как первый элемент линейной структуры данных с именем список.

список удалить последний - удалить и возвратить последний элемент из списка.

Сообщения к ассоциативным структурам данных (таким как словари) представляют добавление или удаление информации.

ages at: ‘Brett Jorgensen’ put: 3 - связывает цепь ‘Brett Jorgensen’ со значением 3 в словаре именуемом ages.

address at: ‘Peggy Jorgensen’ - ищет в словаре именуемом address объект связанный с цепью ‘Peggy Jorgensen’.

Сообщения к прямоугольникам представляют графические запросы и вычисления.

рамка центр - возвращает центр прямоугольника именуемого рамка.

рамка содержит точку: положение курсора - отвечает истина если позиция именуемая положение курсора находится внутри прямоугольника именуемого рамка, и ложь иначе.

рамка пересечь: область вырезания - вычисляет прямоугольник который представляет пересечение двух прямоугольников именуемых рамка и область пересечения.

Сообщения к записям финансовой истории представляют транзакции и запросы

Домашнее хозяйство потратить: 32.50 на: 'коммунальные услуги' - указывает финансовой истории именуемой Домашнее хозяйство что 32 доллара 50 центов был потрачены на оплату коммунальных услуг.

Домашнее хозяйство общие траты на: 'еда' - спрашивает у Домашнего хозяйства сколько денег было потрачено на еду.

Селекторы и аргументы[]

Выражение сообщение описывает получателя, селектор и возможно несколько аргументов. Получатель и аргументы описываются другими выражениями. Селектор задаётся литерально.

Селектор сообщения это имя для типа взаимодействия которое описывает посылающий. Например, в следующем сообщении

theta sin.

получатель это число на которое ссылается переменная с именем theta, а селектор это sin. Как отвечать на сообщение определяет получатель (в данном случае, как вычислить функцию синус для своего значения). В двух предложениях сообщениях

3 + 4.
всего + увеличение.

селектор это +. Оба сообщения просят получателя вычислить и возвратить сумму. Каждое из этих сообщений содержит объект в добавок к селектору. (4 в первом выражении и увеличение во втором). Дополнительный объект в сообщении это аргумент который определяет количество которое нужно добавить.

Следующие два сообщения описывают один и тот же тип операции. Получатель это экземпляр Финансовой истории и он должен вернуть количество денег потраченных на соответсвующую статью. Аргумент показывает статью расходов. Первое предложение запрашивает количество потраченное на коммунальные услуги.

Домашнее хозяйство общие траты на: 'коммунаольные услуги'.

Количество денег потраченное на еду может быть найдено если послать сообщение с тем же селектором, но с другим аргументом.

Домашнее хозяйство общие траты на: 'еда'.

Селектор сообщения определяет какую из операций получателя нужно выполнить. Аргументы это другие объекты которые вовлечены в данную операцию.

Унарные сообщения Сообщения без аргументов называются унарными сообщениями. Например, количество доступных денег в Домашнем хозяйстве это значение унарного выражения сообщения

Домашнее хозяйство количество наличных.

Это сообщение называется унарным потому что используется только один объект, получатель. Селектором унарного сообщения может быть любой идентификатор. Другие примеры унарных сообщений:

тета син.
количество корень.
цепь имя размер.

Сообщения с ключевыми словами Общий вид сообщения с одним или более аргументами это сообщение с ключевыми словами. Селектор сообщения с ключевыми словами состоит из одного или более ключевых слов, по одному перед каждым аргументом. Ключевое слово это просто идентификатор с завершающим двоеточием. Примеры выражений сообщений с одним ключевым словом:

Домашнее хозяйство общие траты на: 'коммунальнные услуги'.
номер макс: предел.

Сообщению с двумя аргументами нужен селектор с двумя ключевыми словами. Примеры выражений с двойными ключевыми слоами

Домашнее хозяйство потратить: 30.45 на: 'еду'.
возрасты от: 'Brett Jorgensen' пом: 3.

Когда ссылаются на селектор с многими ключевыми словами они соединяются. Селекторы последних двух выражений это потратить:на: и от:пом:. Может существовать сообщение с любым количеством ключевых слов, но большинство сообщений системы имеют меньше чем три ключевых слова.

Бинарные сообщения Существует другой тип сообщений с одним аргументом, бинарное сообщение. Селектор бинарного сообщения состоит из одного или двух знаков не букв. Бинарные сообщения в основном используются для арифметических сообщений. Примеры бинарных сообщений:

3 + 4.
всего - 1.
всего <= макс.

Возвращаемые значения[]

Система Смолток предоставляет два пути взаимодействия. Селектор и аргументы передают информацию к получателю о типе ответа. Получатель передаёт информацию обратно возвращая объект который становится значением выражения сообщения. Если сообщение содержит приставку присваивание, объект возвращённый получателем будет новым значением на которое ссылается переменная. Например предложение

сумма3 + 4.

делает 7 новым значением переменной с именем сумма. Предложение

икстета син.

делает синус тета новым значением переменной с именем икс. Если значение тета это единица, новым значением икс становится 0.841471. Если значение тета это 1.5, новым значением икс становится 0.997495.

Число на которое ссылается переменная номер может быть увеличено на удиницу с помощью предложения

номерномер + 1.

Даже если не нужно передавать информацию обратно к посылающему, получатель всегда возвращает значение выражения сообщения. Возвращение значения показывает что ответ на сообщение закончен. Некоторые сообщения нужны только для того чтобы проинформировать получателя о чём либо. Примерами могут быть сообщения к записям о финансовых операциях описанные следующими предложениями.

Домашнее хозяйство потратить: 32.50 на: 'коммунальные услуги'.
Домашнее хозяйство получить: 1000 из: 'зарплата'.

Получатель данных сообщений информирует отправителя только о том что он закончил запись транзакции. По умолчанию возвращаемое значение в таких случаях это обычно получатель. Так что результатом выражения

перДомашнее хозяйство потратить: 32.50 на: 'коммунальные услуги'.

будет присваивание переменой пер того же значения что хранится в переменной Домашнее хозяйство.

Лексический анализ[]

Все сообщения показанные прежде имеют получателя и аргументы заданные с помощью литералов или имён переменных. Когда получатель или аргумент сообщения описывается другим выражением сообщением, имеет значение как происходит лексический анализ выражения. Пример унарного сообщения описывающего получателя другого унарного сообщения

1.5 тан округлить.

Унарные сообщения разбираются слева направо. Первое сообщение в примере это унарный селектор тан посланный 1.5. Значение данного сообщения (число примерно равное 14.1014) получает унарное сообщение округлить и возвращает ближайшее целое, 14. Число 14 это значение всего предложения.

Бинарные сообщения также разбираются слева направо. Пример бинарного сообщения описывающего получателя другого бинарного сообщения:

номер + смещение * 2.

Значение возвращённое номером из сообщения + смещение это получатель бинарного сообщения * 2.

Все бинарные селекторы имеют один и тот же приоритет, только порядок в котором они записаны имеет значение. Заметьте что это делает математические выражения на Смолтоке отличными от таких же выражений на большинстве других языков в которых умножение и деление имеет преимущество над сложением.

Можно использовать скобки для изменения порядка вычисления. Сообщение со скобками посылается раньше любого сообщения за скобками. Если предыдущий пример записать как:

номер + (смещение * 2).

то произведение будет выполнено раньше сложения.

Унарные сообщения имеют более высокий приоритет чем бинарные сообщения. Если унарное и бинарное сообщения используются вместе, то сначала будет послано унарное сообщение. В следующем примере

frame with + border width * 2.

значение frame width это получатель бинарного сообщения чей селектор это + и чей аргумент это значение border width. В свою очередь, значение сообщения + это получатель сообщения * 2. Выражение разбирается так как будто были расставлены скобки следующим образом:

((frame with) + (border width)) * 2.

Скобки можно использовать чтобы послать бинарное сообщение до унарного. Выражение

2 * тета син.

вычисляет два синус тета, в то время как предложение

(2 * тета) син.

вычисляет синус двойного тета.

Когда встречается ключевое слово в сообщении без скобок, оно образует один селектор. Из за этого сцепления не существует правила разбора слева на право для сообщения с ключевыми словами. Если сообщение с ключевыми словами используется как получатель или аргумент другого сообщения с ключевыми словами, то оно должно быть заключено в скобки. Предложение

frame scale: factor max: 5.

описывает сообщение с двумя аргументами чей селектор это scale:max:. Предложение

frame scale: (factor max: 5).

описывает два сообщения с ключевым словом чьи селекторы это scale: и max:. Значение выражения factor max: 5 это аргумент для сообщения frame:.

Бинарное сообщение имеет более высокий приоритет чем сообщение с ключевыми словами. Когда унарные, бинарные и сообщения с ключевыми словами встречаются вместе в одном выражении без скобок, сначала посылаются унарные сообщения, затем бинарные, и последним сообщение с ключевыми словами. Пример

bigFrame width: smallFrame width * 2.

выполняется так как если бы в нём были расставлены скобки следующим образом:

bigFrame width: ((smallFrame width) * 2.

В следующем примере унарное сообщение описывает получателя сообщения с ключевыми словами и бинарное сообщение описывает аргумент.

Упорядоченный набор новый добавить: значение * оценка.

Подводя итог правил разбора получаем:

  1. унарные сообщения разбираются слева направо.
  2. бинарные сообщения разбираются слева направо.
  3. бинарные сообщения имеют приоритет над сообщениями с ключевыми словами.
  4. унарные сообщения имеют приоритет над бинарными сообщениями.
  5. сообщения заключённые в скобки имеют приоритет над унарными сообщениями.

Каскады[]

Есть одна специальная синтаксическая форма называемая каскад которая предписывает многим сообщения посылаться одному и тому же объекту. Любая последовательность сообщений может быть записана без каскадов. Однако, каскад часто упрощает выражение т.к. становится не нужным введение промежуточных переменных. Выражение сообщение каскад содержит одно описание получателя со следующими несколькими сообщениями разделёнными точной с запятой. Например

Упорядоченный набор новый добавить: 1; добавить: 2; добавить: 3.

Три сообщения добавить: посылаются результату Упорядоченный набор новый. Без каскада для этого бы потребовалось четыре сообщения и переменная. Например, следующие четыре предложения, разделённые точной, производят тот же результат что и сообщение с каскадом.

времУпорядоченный набор новый.
врем добавить: 1.
врем добавить: 2.
врем добавить: 3.

Блоки[]

Блоки это объекты используемые во многих управляющих конструкциях системы Смолток. Блок представляет отложенную последовательность действий. Выражение блок содержит последовательность предложений разделённых точками и отделяется с помощью квадратных скобок. Например

[ целоецелое + 1. ].

или

[ целоецелое + 1. ряд от: целое пом: 0. ].

Когда встречается выражение блок, предложения заключённые в квадратные скобки не выполняются немедленно. Значение выражения блока это объект который может выполнить предложения заключённые в скобки позже, когда это потребуется. Например, выражение

   действия
      от: 'месячные выплаты'
      пом: [
         Домашнее хозяйство потратить: 650 на: 'аренда'.
         Домашнее хозяйство потратить: 7.25 на: 'газета'.
         Домашнее хозяйство потратить: 225.50 на: 'уплата за машину'. ].

не посылает сообщения потратить:на: Домашнему хозяйству. Оно просто связывает блок с цепью 'месячные выплаты'.

Последовательность выражений описываемая блоком будет выполнена когда блок получит унарное сообщение значение. Например, следующие два выражения имеют одинаковый эффект.

целоецелое + 1.

и

[ целоецелое + 1. ] значение.

Объект на который ссылается выражение

действия от: 'месячные выплаты'

это блок содержащий три сообщения потратить:на:. Выполнение выражения

(действия от: 'месячные выплаты') значение.

приводит к тому что эти три сообщения посылаются Домашнему хозяйству.

Блок также можно присвоить переменной. Так если выполнить предложение

увеличивающий блок[ номер < номер + 1. ].

тогда предложение

увеличивающий блок значение.

увеличит номер.

Объект возвращаемый сообщением значение посланным блоку это значение последнего предложения в блоке. Так если выполнить предложение

доб блок[ номер + 1. ].

то другим способом увеличения номера будет предложение

номердоб блок значение.

Блок который не содержит ни одного предложения возвращает пусто когда ему посылается сообщение значение. Предложение

[ ] значение.

имеет значение пусто.

Управляющие конструкции[]

Управляющие конструкции определяют порядок некоторых действий. Основной управляющей конструкцией в языке Смолток является последовательное выполнение. Многие непоследовательные управляющие конструкции могут быть реализованы с помощь блоков. Эти управляющие конструкции выполняются с помощью посылки сообщений блокам или сообщений с одним или несколькими блоками в качестве параметров. Ответ на такое сообщение управляющую конструкцию определяет порядок выполнения в соответствии со значениями сообщений посланных блокам.

Рассмотрение выполнения следующих выражений даёт пример способа работы блоков

   блок увеличить[ номерномер + 1. ].
   блок сумма[ сумма + (номер * номер). ].
   сумма0.
   номер1.
   суммаблок сумма значение.
   блок увеличить значение.
   суммаблок сумма значение.

15 действий выполняющихся в результате выполнения последовательности данных предложений это:

  1. присвоить блок переменной блок увеличить
  2. присвоить блок переменной блок сумма
  3. присвоить число 0 переменной сумма
  4. присвоить число 1 переменной номер
  5. послать сообщение значение блоку блок сумма
  6. послать сообщение * 1 числу 1
  7. послать сообщение + 1 числу 0
  8. присвоить число 1 переменной сумма
  9. послать сообщение значение блоку блок увеличить
  10. послать сообщение + 1 числу 1
  11. присвоить число 2 переменной номер
  12. послать сообщение значение блоку блок сумма
  13. послать сообщение * 2 числу 2
  14. послать сообщение + 4 числу 1
  15. присвоить число 5 переменной сумма

Пример управляющей конструкции реализованной с помощью блоков это простое повторение, представленное в виде сообщения к целому с селектором раз повторять: и блоком в качестве аргумента. Целое число должно отвечать за посылку сообщения значение блоку параметру количество раз равное самому целому. Например, следующее выражение удваивает значение переменной количество четыре раза.

4 раз повторить: [ количествоколичество + количество. ].

Условные конструкции[]

Две наиболее часто используемые управляющие конструкции построенные с помощью блоков это условный выбор и условное повторение. Условный выбор подобен конструкции if-then-else в Алголоподобных языках а условное повторение подобно выражениям while и until. Эти условные управляющие конструкции используют два Логических объекта именуемых истина и ложь которые были описаны в разделе псевдо переменные. Логические значения возвращаются сообщениями которые отвечают на вопрос да-нет (например, сообщения сравнения величин <, =, <=, >, >=, ~=).

Условный выбор. Условный выбор действий обеспечивается с помощью сообщения ifTrue:ifFalse: посылаемого Логическому значению и двух блоков параметров. Единственные объекты которые понимают сообщение истина:ложь: это истина и ложь. Они имеют противоположные результаты: истина посылает сообщение значение к первому агрументу блоку и игнорирует второй; ложь посылает сообщение значение ко второму аргументу блоку и игнорирует первый. Например, следующее выражение присваивает 0 или 1 переменной чётность в зависимости от того делится ли на 2 значение переменной число. Бинарное сообщение \\ вычисляет функцию деления по модулю.

число \\ 2 = 0 ifTrue: [ чётность0. ] ifFalse: [ чётность1. ].

Значение возвращаемое сообщением ifTrue:ifFalse: это значение блока который был выполнен. Предыдущий пример можно также записать так:

чётностьчисло \\ 2 = 0 ifTrue: [ 0. ] ifFalse: [ 1. ].

В дополнение к сообщениям ifTrue:ifFalse: существуют два сообщения с одним ключевым словом которые определяют только одну альтернативу. Селекторы этих сообщений это ifTrue: и ifFalse:. Эти сообщение имеют тот же эффект что и сообщение ifTrue:ifFalse: когда один из аргументов это пустой блок. Например, данные предложения имеют один и тот же эффект

номер <= предел ifTrue: [ итогитог + (список at: номер). ].

и

номер <= предел ifTrue: [ итогитог + (список at: номер). ] ifFalse: [ ].

Т.к. значение пустого блого это пусто, следующее выражение должно присваивать пусто последнему элементу если номер больше предела.

последний элементномер > предел ifTrue: [ список at: номер. ].

Условное повторение. Условное повторение действий обеспечивается с помощью сообщения к блоку whileTrue: и другого блока в качестве аргумента. Блок получатель посылает себе сообщение значение и если ответ это истина он посылает параметру сообщение значение и начинает с начала посылая себе снова сообщение значение. Когда ответ получателя на сообщение значение становится ложь он заканчивает повторение и возвращается из метода пока истина:. Например, условное выполнение может быть использовано для инициализации всех элементов ряда именуемого список.

   номер1.
   [ номер <= список размер. ]
      whileTrue: [ список at: номер put: 0. номерномер + 1. ].

Блоки также понимают сообщение с селектором whileFalse: которое повторяет выполнение аргумента пока значение получателя ложно. Так что следующее выражение эквивалентно предыдущему.

   номер1.
   [ номер > список размер. ]
      whileFalse: [ список at: номер put: 0. номерномер + 1. ].

Программист может выбирать соответствующее сообщение которое делает назначение повторения более ясным. Значение возвращаемое сообщениями пока ислина: и пока ложь: всегда пусто.

Аргументы блока[]

Чтобы сделать более простым написание некоторых непоследовательных управляющих конструкций блоки могут иметь один или более аргументов. Аргументы блока определяются с помощью добавления в начало блока идентификаторов с двоеточием в начале имени отделённых от выражений блока вертикальной чертой. Следующие два примера описывают блоки с одним аргументом.

[ :ряд | всеговсего + ряд размер. ].

и

[ :новый элемент | номерномер + 1. список от: номер пом: новый элемент. ].

Наиболее часто блоки с аргументами используются чтобы реализовать функции которые применяются ко всем элементам структуры данных. Например, многие объекты предоставляющие различные структуры данных отвечают на сообщение делать:, которое берёт в качестве аргумента блок с одним параметром. Объект который получает сообщение делать: выполняет блок один раз для каждого элемента содержащегося в структуре данных. Каждый элемент является значением аргумента при выполнении блока параметра. Следующий пример вычисляет сумму квадратов первых пяти простых чисел. Результат это значение суммы.

сумма0.
#( 2 3 5 7 11 ) делать: [ :прост | суммасумма + (прост * прост). ].

Сообщение собрать: создаёт совокупность значений полученных от блока когда он применяется к элементам получателя. Значение следующего выражения это ряд квадратов первых пяти простых чисел.

#( 2 3 5 7 11 ) собрать: [ :прост | прост * прост. ].

Объект который выполняет эту управляющую конструкцию передаёт значение блоку при помощи сообщения значение:. Блок с одним параметром отвечает на сообщение значение: путём помещения аргумента сообщения значение: в параметр блока и выполнения предложений блока. Например, результатом вычисления следующих предложений будет значение 7 в переменной всего.

доб размер[ :ряд | всеговсего + ряд размер. ].
всего0.
доб размер значение: #( ).
доб размер значение: #( 1 2 ).
доб размер значение: #( ).

Блок может принимать более чем один параметр. Например

[ | а * а + (б * б). ].

или

[ :frame :clippingBox | frame intersect: clippingBox. ].

Блок должен иметь сколько же аргументов сколько есть ключевых слов значение: в селекторе метода выполняемым им. Два вышеупомянутых блока должны быть выполнены с помощью сообщения с двумя ключевыми словами значение:значение:. Два аргумента сообщения определяют соответственно два значения параметра блока. Если блок получает сообщение с другим количеством аргументов то будет сообщение об ошибке.

Сводка теримнологии[]

предложение - последовательность знаков которая описывает объект.

литерал - предложение описывающее константу, такую как чило или цепь.

символ - цепь чья последовательность знаков гарантированно отличается от последовательности любого другого символа.

ряд - структура данных чьи элементы доступны при помощи целых чисел.

имя переменной - предложение описывающее текущее значение переменной.

присваивание - предложение описывающее изменение значения переменной.

псевдо переменная - предложение подобное имени переменной. Но, в отличии от имени переменной, значение псевдо переменной нельзя изменить при помощи присваивания.

получатель - объект который получил сообщение.

селектор сообщения - имя типа операции сообщения посланного получателю.

аргумент сообщения - объект который определяет дополнительную информацию для операции.

унарное сообщение - сообщение без аргументов.

ключевое слово - идентификатор с завершающим двоеточием.

ключевое сообщение - сообщение с одним или несколькими аргументами чей селектор состоит из одного или более ключевых слов.

бинарное сообщение - сообщение с одним аргументов чей селектор состоит из специальных знаков.

сообщение каскад - описание нескольких сообщений к одному объекту одним предложением.

блок - описание отложенной последовательности действий.

аргумент блока - параметр который должен быть задан при выполнении блока.

значение - сообщение блоку которое запрашивает выполнение набора действий который представляет блок.

значение: - ключевое слово в сообщении блоку которое передаёт блоку аргументы; данное сообщение запрашивает выполнение набора действий который представляет блок.

истина:ложь: - сообщение Логическому значению запрашивающее условный выбор.

ложь:истина: - сообщение Логическому значению запрашивающее условный выбор.

истина: - сообщение Логическому значению запрашивающее условный выбор.

ложь: - сообщение Логическому значению запрашивающее условный выбор.

пока истина: - сообщение блоку запрашивающее условное повторение.

пока ложь: - сообщение блоку запрашивающее условное повторение.

делать: - сообщение совокупности запрашивающее перебор её элементов.

собрать: - сообщение совокупности запрашивающее преобразование её элементов.

Advertisement