Современные языки программирования предоставляют способы для выполнения кода условно и для повторения блоков кода. В C, есть \verb|if () {},| \verb|if () {} else {},| \verb|do {} while (),| \verb|while () {},| и \verb|for (;;) {}|. КонструкцыиКонструкции такого типа обычно являются частью языка.
<!--
-->
Однако в СмолтокSmalltalk сам не содержытсодержит эти конструкцыиконструкции. Вместо этого они создаются путём посылки сообщений объектам. В результатом чего появляется возможность изменять работу управляющих сообщений если тебя не устраивает способ их работы (не рекомендуется!). Если тебе нужна новая управляющая структура, ты можэшможешь написать её. Например, в СмолтокеSmalltalk нет сообщения переключатель/случай, таким образом если ты думаешдумаешь, что оно тебе нужно, ты можэшможешь написать его (опять жэже этого не рекомендуется делать по причинам, изложэннымизложенным в Главе ---, ---). Фактически, ты вероятно не нуждаешсянуждаешься в управляющих структурах, отличных от присутствующих в стандартной библиотеке СмолтокаSmalltalk. Давай рассмотрим эти структуры.
<!--
==Условное выполнение==
Простейшей из условных структур является выполнение блока кода если некоторое условие истинно (или ложно). В СмолтокSmalltalk есть два сообщения: одно когда условие истинно и одно когда оно ложно. Оба сообщения посылаются экземпляру класса \emph{Логический} (т.е. \emph{истина} или \emph{ложь}). Есть два основных подхода---
<!--
The simplest type of conditional execution is to only execute a particular block of code if some condition is true (or false). In Smalltalk, there are two messages, one for when the condition is true and one for when it's false. Both messages are sent to an instance of Boolean (ie, to true or false). Here is the general approach, with an example.
ложь?: [Транскрипт пс; показать: 'Ложь'].
СмолтокSmalltalk не предоставляет простой конструкции, аналогичной Cшной \verb|if () {}| \verb|else if () {}| \verb|else {}|. Но можно это сделать это при помощи вложенний:
<!--
==Циклы==
В СмолтокеSmalltalk нет циклов. Вместо этого он предоставляет эту возможность путём посылки сообщений БлокамКода. Наиболее общий тип цикла это когда цикл продолжается пока некоторое условие истинно. Так долго как значение блока (т.е. последнее предложение в блоке) \emph{истинно}, цикл будет продолжаться. Этот тип цикла подобен цыклуциклу \verb|do {} while ();| в C. Далее показан синтаксис таковатакого цикла и пример.
<!--
счётчик < 10 ] покаИстинен.
Условие можэтможет быть противоположным так что блок будет выполняться пока его значение \emph{ложно}.
<!--
[некоторый код] покаЛож.
Следующий цыклцикл подобен предыдущему, но если первый блок истинен второй блок выполняется. Этот тип цыклацикла отчасти похож на цыклцикл \verb|while () {}| языка C но он более универсальный, потому что он допускает много предложэнийпредложений в первом блоке. Опять рассмотрим синтаксис таковатакого цыклацикла и пример.
<!--
[Транскрипт: пс; показать: 'Продолжаю']
Как и в предыдущем цыклецикле ты можэшможешь обратить условие при котором цыклцикл продолжается.
<!--
-->
[некоторый код]
покаЛожен:
покаЛожэн:
[следующйследующий код]
Последний непосредственный механизм цыклацикла это просто повторение. Это означает что код в блоке должэндолжен заканчивать выполнение метода, или что-либо останавливает выполнение иначе ты получишполучишь бесконечный цыклцикл.
<!--
[некоторый код] повторять.
[(Диалог подтвердить: 'ПродолжэниеПродолжение') ложложь?: [^сам].
Транскрипт пс; показать: 'Продолжаю'] повторять.
==Повторения==
В СмолтокеSmalltalk есть три способа повторить блок заданное количество раз. Два из них используют индэксиндекс, а в оставшэмсяоставшемся принимается что ты не беспокоишсябеспокоишься о номере итерацыиитерации. Если в цыклецикле не имеет значения значение индэксаиндекса, простейшымпростейшим способом будет послать сообщение \verb|разПовторить:| с блоком в виде параметра. Например:
<!--
5 разПовторить: [Транскрипт: пс; показать: 'привет'].
Если в цыклецикле надо знать номер итерацыиитерации, ты должэндолжен послать одно из следующих двух сообщений. Если тебе нужэннужен цыклцикл от однавоодного числа до друговадругого, с единичным шагом, пошли сообщение \verb|до:делать:| с параметром в виде блока. Блок ожидает получения одного параметра --- индэксаиндекса. Например,
<!--
-->
1 до: 5 делать:
[ :индэксиндекс | Транскрипт пс; показать: индэксиндекс строкаДляПечати ].
Если тебе нужэннужен цыклцикл подобный данному но тебе надо изменять индэксиндекс на единицу, ты можэшможешь определить значение шага с помощью сообщения \verb|до:шаг:делать:|. Опять это сообщение ожыдаетожидает блок и он должэндолжен ожыдатьожидать получения индэксаиндекса. Например,
<!--
-->
15 до: 1 шаг: -2 делать:
[ :индэксиндекс | Транскрипт пс; показать: индэксиндекс строкаДляПечати ].
Вопреки существованию этих сообщений, они менее полезны чем ты можэшможешь предположытьпредположить. Наиболее часто используемые цыклыциклы выполняются для совокупности объектов, и совокупности имеют мощные механизмы для выполнения цыкловциклов. Мы поговорим подробнее о цыклахциклах для совокупностей в Главе \potom, \potom.
<!--
==Оптимизированные сообщения==
БлокиКода используются в вышэперечисленныхвышеперечисленных управляющих структурах как параметры, и иногда как получатели сообщений. БлокКода можэтможет быть помещён в переменную или можэтможет быть записан как литерал --- т.е. как код заключённый в квадратные скобки.
<!--
-->
Если все БлокиКода участвующие в сообщениях это литеральные блоки, сообщение компилируется как подстановка т.е. посылка сообщения не используется. С другой стороны, если любой БлокКода участвующий в сообщении как переменная а не литерал, код не будет скомпилирован как подстановка и будет производиться посылка сообщения. Обычно эти сообщения компилируются как подстановка ибо большынствобольшинство блоков являются литеральными.
<!--
|