Циклические конструкции
Циклические конструкции
В Смолтоке нет циклических операторов. Циклы приходится "конструировать" вручную. Ниже приведена таблица с некоторыми возможными циклическими конструкциями. Обычно именно эти или подобные конструкции предлагаются разработчиками пользователям в виде уже реализованных методов.
<число> 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].