Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[3]

Переменные и присваивание значений

Литеральные константы всегда ссылаются на один и тот же объект, а имена переменных в разное время могут ссылаться на различные объекты. Ссылка на объект по имени переменной изменяется тогда, когда выполняется выражение присваивания, то есть выражение, содержащее префикс присваивания. Префикс присваивания состоит из имени переменной, значение которой будет изменено, за которым следует левая стрелка "«-", которую в последних версиях языка Smalltalk можно заменять на более привычную пару символов ":=". Следующий пример - выражение с префиксом присваивания. Оно указывает, что переменная с именем quantity будет теперь ссылаться на объект, представляющий число 19:

quantity 19

Сообщения

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

theta sin

получатель сообщения - число, на которое ссылается переменная с именем theta, а имя сообщения - sin. Получатель сам решает, как ответить на сообщение, в данном случае, как вычислить функцию синуса от своего значения.

В сообщении previousTotal + increment, имя сообщения - символ "+". Сообщение просит получателя вычислить сумму. В дополнение к имени, сообщение содержит еще один объект - increment, определяющий прибавляемое значение. Дополнительные объекты в сообщении - его аргументы.

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

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

theta sin quantity sqrt namestring size

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

index max: limit

ages at: Brett Jorgensen put: 3

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


имя последнего сообщения - at:put:. Число ключевых слов в сообщении может быть любым, но большинство сообщений в системе имеют их не более трех.

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

total - 1 total <= max

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

sum - 3 + 4

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

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

1.Унарные выражения разбираются слева направо.

2.Бинарные выражения разбираются слева направо.

3.Бинарные выражения имеют приоритет над ключевыми выражениями.

4.Унарные выражения имеют приоритет над бинарными выражениями.

5.Выражения, взятые в скобки, имеют приоритет над унарными выражениями.

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

OrderedCollection new add: 1; add: 2; add: 3

Здесь три сообщения add: посылаются результату выражения OrderedCollection new. Без каскадирования для получения того же самого результата потребовалось бы четыре выражения (выражения друг от друга отделяются точкой) и переменная:

temp

temp - OrderedCollection new. temp add: 1. temp add: 2. temp add: 3

Блоки

Блоки - объекты, используемые во многих управляющих структурах системы Smalltalk. Блок представляет собой отложенную последовательность действий.


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

[index *- index + 1] или [index *- index + 1. array at: index put: 0]

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

index *- index + 1 и [index *- index + 1] value

Объект, возвращаемый после выполнения посланного блоку сообщения value, представляет значение последнего выполненного выражения блока. Блок, который не содержит никаких выражений ([]), когда ему посылается сообщение value, возвращает объект nil, неопределенный объект.

Управляющие структуры

Управляющие структуры определяют порядок некоторых действий. Фундаментальная управляющая структура в языке Smalltalk-80 обеспечивает последовательное выполнение следующих друг за другом выражений языка. Многие управляющие структуры, нарушающие последовательное выполнение выражений, могут быть реализованы с помощью блоков. Эти управляющие структуры вызываются либо посылкой сообщения блоку, либо посылкой сообщения с одним или более аргументами-блоками. Ответ на одно из эти сообщений и определяет порядок дальнейших действий посредством посылки блоку (или блокам) сообщения value.

Пример управляющей структуры, реализованной с помощью блоков, - простое повторение действий, представленное посылкой целому числу сообщения timesRepeat: с блоком в качестве аргумента. В ответ целое число посылает блоку-аргументу сообщение value столько раз, сколько единиц содержит значение числа. Следующее выражение четыре раза удвоит значение переменной с именем amount:

4 timesRepeat: [amount *- amount + amount]

Условные выражения

Условные управляющие структуры используют два логических объекта true и false, логическую истину и логическую ложь. Логические объекты возвращаются после посылок сообщений, которые требуют простого ответа "да-нет" (например, сообщений для сравнения величин: <, <=, >, >=). Примером общей управляющей структуры, реализованной с помощью блоков, является условный выбор.

Условный выбор похож на оператор if-then-else в алголоподобных языках и обеспечивается сообщением к логическим объектам с именем сообщения ifTrue:ifFalse: (еслиИстина:еслиЛожь:) и двумя аргументами-блоками. Например, следующее выражение присваивает 0 или 1 переменной parity, в зависимости от того, делится на 2 значение переменной number или нет. Бинарное сообщение \\ вычисляет остаток от деления целых чисел.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5]