Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 122
Текст из файла (страница 122)
соипс <= соипс + 1) (яив <- 3; соипс <- 3) "результат вычислений" ;яив <- яив + соипг. соипг <- соипг + 1] -> [соипг <= 2] хй11етгие че1ие -> [соипг <= 2] "значение, посланное методом нЬ11еТгие" ;соипг <= 2] гегигпя ге1ве Другая циклическая управляющая структура — простое повторение с контролем ;четчика.
Этим целям служит метод для целых чисел, называемый г1веяйереас:. Когда метод с1пеяйереаг: передается целому числу с параметром в качестве блока, количество выполнений этого блока равно этому целому числу. Например, хСиЬе <- 1. 3 Г1пеяйереас: [хСиЬе <- хСиЬе * х] вычисляет куб числа х с помощью довольно длительного процесса. Управляющие структуры, подобные операторам цикла йог в языке А].601 бй, могут быть построены на основе одного из методов для целых чисел.
Два наиболее полезных нз них — го: <(о: и го: ьу: бо:. Сначала рассмотрим метод со: с(о:. Параметр го:— >то выражение с целыми числами, значение которого служит в качестве предельного значения цикла. Параметр с(о: — это блок, подлежащий выполнению с помощью метода зля целых чисел. Метод Го:с(о: генерирует последовательность значениИ, начиная с целою литерала, которому передается сообщение, и заканчивая значением параметра = о: . Рассмотрим следующее сообщение: 1 го: 5 с(о: [яип <- яив +х] 11.5. 8ведение в язык $ва)1)а[[г Я6Р Блок выполняется пять раз, Внутренние значения, вычисленные и возвращаемые объектом 1, равны 1, 2, 3, 4 и 5.
Блок, образующий тело цикла, может иметь параметры. Эти параметры неявно присваиваются внутренним значениям, созданным сообщением. Внутренние значения — это значения, возвращаемые числовым объектом, которому было передано полное сообщение. Рассмотрим следующее сообщение: 2 Со: 10 Ьу: 2 с)о: [:ечеп 1 впж <- вою + ечеп] Это сообщение приводит к пятикратному выполнению блока, но в этом случае параметр блока ечеп имеет внузренние значения, равные 2, 4, 6, 8 и 1О. 11.3.Я.З.
Ветеленне Конструкции ветвления также имеют обычный вид, но действуют необычным образом. Обьекты стив и Га1ве содержат метод 1ЕТгце:. Два аргумента сообщения 1ТТгце: 1ГГа1ве: представляют собой части "то" и "иначе" конструкции ветвления. Сообщение передается булевскому выражению. Если значением выражения является объект ккие, то обьекту схэзе передается сообщение.
В этом случае метод 1йТгце: 1ТГа1ве: передает сообщение че1ие его первому аргументу и игнорирует второй аргумент. Если посылается сообщение ха1ве, имеет место противоположная ситуация. В качестве примера рассмотрим следующее сообщение: соса1 = 0 1ГТзце: [ачегаае <- 0] 1ГГа1ве: [ачегаае <- впж // Сопа1) Булевское выражение соса1 = 0 вызывает передачу сообщения = 0 объекту соса1, который в свою очередь возвращает либо объект Кхие, либо объект ха1ве. Объект, полученный в качестве результата (либо ккие, либо хе1ве), затем используется как получатель сообщения, переданного методу 1ГТг це: 1ГГа1ве:.
Двумя параметрами этого метода являются блоки "то" и "иначе", один из которых подлежит выполнению. Оператор // означает деление целых чисел. Объектам Ккие и хе1ве могут передаваться четыре разных сообщения. Кроме сообщения 1ТТгце:11Га1ве:, есть еше сообщения дйТгие:, 11Га1ве: и 1гГа1ве:11Тгие:. Семантика управляющих структур, которые мы только что обсудили, может показаться несколько странной, но для опытных пользователей языка Бгоайга!М оиа вполне естественна.
Кроме того, возможность обрабатывать управляющие структуры в рамках такого подхода добавляет мощи и гибкости в модель передачи сообщений. Она также упрощает язык Бглайгайг, устраняя необходимость в любой структуре, помимо объектов и передачи сообщений, 11.$.5. Классы Классы языка Бшайгарк имеют четыре части: ° имя класса; ° нмя суперкласса; ° объявления переменных экземпляров; ° объявления методов экземпляров и классов. 470 Глава 11.
Поддержка объектно-ориентированного программирования Переменные экземпляров невидимы для других объектов. Каждая переменная экземпляра ссылается на один объект, называемый ее значением. Значения всех переменных экземпляров вместе представляют текущее состояние экземпляра. В языке Бща[йа!й все классы сами по себе являются объектами. Это позволяет классам получать сообщения. Определения классов могут содержать и методы классов. и методы экземпляров, при этом методы классов отвечают на сообщения, передаваемые классам, а методы экземпляров отвечают на сообщения, передаваемые экземплярам класса. Передача сообщения пем классу в операторе присваивания создает экземпляр класса.
При этом переменная, стоящая в левой части оператора, назначается ссылкой на вновь создаваемый объект. Например, фрагмент кода оогРеп <- Реп пем создает экземпляр класса Реп (передавая сообщение пем классу Реп) и назначает пере- менную согрел ссылкой на него. 11.5.6. Дополнительные сведение о методах В этом разделе мы исследуем некоторые свойства методов, не описанные в развеле ! !.5.2.
Следующий метод иллюстрирует использование временных переменных: 11гзс: х зесопс[: у ! севр ! севр <- х ь у. севр > 1000 1ТТгсе. "[у <- 1000]. у Этот метод складывает значения двух параметров и помешает сумму во временную переменную севр.
Если значение переменной севр больше, чем 1000, второму параметру у присваивается 100 0. Значение переменной у является возвращаемым объектом. Псевдопеременная ве1à — это имя объекта, ссылающегося на объект, в котором она появляется. В силу этого псевдопеременная ве1Е используется лля передачи рекурсивных сообщений, или лля передачи сообщений объекта самому себе. Имя объекта ве1Е часто используется для вывода сообщений об ошибках на экран дисплея.
как в следующем примере: Сога1 = 0 1ТТгое: [зе11 еггог: 'Ошибка — невозможно вычислить среднее'] 11Га1зе: [" аив // соса1] Если значение переменной соса1 равно О, этот код посылает сообщение об ошибке: ' Ошибка - невозможно вычислить среднее ' объекту, в котором нахолится этот код. В противном случае он возвращает значение выражения зов // с о с а1. Сообщение еггог, подобно другим сообщениям, направляется суперклассу объекта, которому оно было передано, если этот объект не содержит метол для его обработки.
Если ни один другой класс-предок не имеет метода для обработки сообщения ег гог, то это сообщение получает системный объект ОЬзесс, содержащий метод еггсг. Метод 11.5. Вввйвиив в язык Вша[[[а[[с Я71 еггог из системного объекта ОЬзесс печатает параметры сообщения и прекращает выполнение программы. В качестве примера релурсии рассмотрим следующий метод, который понимается целочисленными объектами.
Он взят из работы Оо)бЬегя апг[ КоЬаоп (! 983): йасгогйа1 ве1г = О 1ЙТгие: ["1]. ае1г' < О 11Тгце: [ве1Г еггог 'Факториал не определен') 1ЙРа1ве: [" ае1г * [ве1Й вЂ” 1) бассогда1] Этот унарный метод лля целочисленных объектов можно вызвать таким сообщением, как 5 Тасгог1а1 Первое булевское выражение ве1б = О передает параметр О методу = целочисленного объекта, которому передается сообщение Тасгог1а1. Сообщение 1йтгие: [ "1] затем передается результату выполнения метода =. Если результатом является объект кгие, как это может оказаться для сообщения О Тасгог1а1, то отправителю сообщения Тасгог1а1 возвращается значение 1.
Если результатом выполнения метода = является объект Еа1ае, ничего не происходит, поскольку метод ТТТгие: в объекте Ее1ве определен так, что он ничего не делает. Следующее булевское выражение ве1г < О передает параметр О методу < целочисленного объекта, которому перелается сообщение Тасгог1а1. Оставшаяся часть сообщения Гасгог1а1 (полное сообщение 1ТТгце: 1ЙГа1ве:) затем посылается результату метала <. Если результирующий объект — сгибе, то обьекту, которому было передано сообщение йасгог1а1, передается сообщение об ошибке. Если результатом метода < является объект Ее1ве, то выполняется блок из части 1ЕРа1ве: метода 1йТгце:1рра1ве:. а результат возвращается объекту — отправителю сообщения гас ог1а1.
Чтобы понять сообщение 1ТРа1ве:, мы должны уяснить приоритеты вычисления сообщений. В этом выражении есть два бинарных выражения (с операциями * и -) и одно унарное выражение (Тасгог1а1). Напомним, что унарные выражения имеют более высокий приоритет, чем бинарные, если бинарные выражения не заключены в скобки. Кроме того. все выражения имеют левую ассоциативность. Теперь порядок вычислений ясен.