Объектно-ориентированное программирование.Язык Смолток

Циклические конструкции



Циклические конструкции

В Смолтоке нет циклических операторов. Циклы приходится "конструировать" вручную. Ниже приведена таблица с некоторыми возможными циклическими конструкциями. Обычно именно эти или подобные конструкции предлагаются разработчиками пользователям в виде уже реализованных методов.

<число> timesRepeat:

            [ блок сообщений ]

Повторить блок заданное <число> раз

[блок условия] whileFalse:

            [ блок сообщений ]



Пока условие ложно, выполняются сообщения

[блок условия] whileTrue:

            [ блок сообщений ]

Пока условие истинно, выполняются сообщения

<число1> TO:<число2> BY:<шаг> DO:

            [ :<переменная> | блок сообщений ]

Выполнить блок сообщений, пока значение <переменной>, изменяющее свое значение с заданным шагом, принадлежит промежутку (число1,число2)

<объект> выполнить:

            [ :<переменная> | блок сообщений ]

Значение <переменной> присваивается последовательно элементам <объект>

<объект> выбрать:

            [ :<переменная> | <условие> ]

Изменяет <объект>, удаляя элементы, не удовлетворяющие условию

<объект> исключить:

            [ :<переменная> | <условие> ]

Изменяет <объект>, удаляя элементы, удовлетворяющие условию

<объект> собрать: [ :<переменная> | сообщение]

Заменяет каждый элемент <объекта> на результат выполненного сообщения

Интересно посмотреть, как выглядят "изнутри" некоторые из этих методов.

а) Условия whileTrue (покаИстина), whileFalse (покаЛожь):

whileTrue: BLOCK

"Выполняет заданный блок до тех пор, пока приемник не

будет иметь значение 'ложь'. Выдает нуль"

self value ifTrue: [BLOCK value. self whileTrue: BLOCK ].

^nil!

whileFalse: BLOCK

"Выполняет заданный блок до тех пор, пока приемник не

будет иметь значение 'истина'. Выдает нуль"

self value ifFalse: [BLOCK value.
self whileFalse: BLOCK ].

^nil!

Пример программы, копирующей файл SOURCE.TXT в файл DEST.TXT:

| ввод вывод |

ввод:= Файл полноеИмя: 'SOURCE.TXT'.

вывод:=Файл полноеИмя: 'DEST.TXT'.

[ввод вКонце]

whileFalse: [ вывод поместитьСледующий: ввод следующий ].

ввод закрыть.

вывод закрыть.

б) Простые циклы ( выполнить заданный блок столько раз, сколько задано приемником):

timesRepeat: Block

| n |

n := self.

[n > 0] whileTrue: [n := n - 1. Block value]

Например:

3 timesRepeat: [ Черепашка переместитьНа: 100; повернутьНа: 120 ]

в) Простые итерации (арифметические циклы) можно определить в виде следующего метода:

TO:limit BY:step DO:block

self<=limit

ifTrue:

[block value: self.

(self+step) TO: limit BY step DO: block]

Например:

sum := 0.

1 to:100 by:2 do: [:each | sum := sum + each].


Содержание раздела