Содержание


Язык программирования Nimrod

Часть 3. Конструкции управления потоком выполнения

Comments

Серия контента:

Этот контент является частью # из серии # статей: Язык программирования Nimrod

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Язык программирования Nimrod

Следите за выходом новых статей этой серии.

Nimrod - язык программирования, сочетающий в себе наилучшие черты различных стилей программирования. В первой статье был представлен общий обзор этого языка. Во второй статье описываются лексические элементы языка и основные типы данных. Конструкциям управления потоком выполнения посвящена данная статья. В четвёртой статье будут рассматриваться процедуры и операторы языка. Составные и производные типы данных - тема пятой статьи. В шестой статье будут описаны модули и макроопределения. В седьмой и восьмой статьях, завершающих цикл, будет подробно рассмотрена поддержка объектно-ориентированного программирования.

Конструкции управления последовательностью выполнения инструкций являются основой, своеобразным скелетом большинства языков программирования. Здесь Nimrod не является исключением и позволяет выполнять выбор одного из вариантов по заданному условию, а также многократно повторять определённый набор инструкций.

1. Конструкция if [elif] else

Конструкция выбора варианта в зависимости от некоторого условия может быть записана в простой форме, показанной в листинге 1.

Листинг 1. Простая форма конструкции if else
if midd_temper <= 15:
  echo("Осень. Пора включать отопление.")
else:
  echo("Пока ещё можно экономить энергоресурсы.")

Если условия более сложные и предполагается возможность выбора из более, чем двух вариантов, то используется полная форма конструкции, показанная в листинге 2.

Листинг 2. Полная форма конструкции if elif else
if errs_count == 0:
  echo("Отлично. Задание выполнено без замечаний.")
elif errs_count <= 2:
  echo("Хорошо. Задание выполнено, но имеются недочёты.")
elif errs_count <= 5:
  echo("Удовлетворительно. Задание можно считать выполненным 
  только после работы над ошибками.")
else:
  echo("Плохо. Задание не выполнено.")

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

2. Комментарии

При ознакомлении с конструкциями языка Nimrod следует уделить некоторое внимание организации подсистемы комментариев в этом языке. Дело в том, что строки комментариев Nimrod также зависят от отступов. Более того, комментарии являются лексемами (tokens) языка, и именно поэтому непременно должны размещаться в определённых местах исходного кода, чтобы синтаксическое дерево сформировалось корректно. Это небольшое усложнение позволяет существенно улучшить внешний вид файлов исходного кода при просмотре и особенно при распечатке, а кроме того, упрощает работу средствам генерации документации. Таким образом, программист, просматривая исходный код, всегда будет точно знать, к какому фрагменту кода относится тот или иной комментарий.

На практике описанная выше подсистема комментариев работает так, как показано в листинге 3.

Листинг 3. Контекстно зависимые комментарии в языке Nimrod
var errs_count = 0
# Счётчик ошибок. 
# Комментарии выровнены по предыдущей инструкции и являются синтаксически корректными.
var coeff = 1
  # Коэффициент сложности.
  # Здесь строки комментариев не выровнены по предыдущей инструкции, поэтому
  # при компиляции будет возникать синтаксическая ошибка.

Итак, строка комментария начинается с символа '#' и может быть расположена в любом месте вне границ литералов. Многострочные комментарии обязательно должны быть выровнены по одному и тому же столбцу, как показано в листинге 4.

Листинг 4. Различия в принадлежности комментариев разным частям программы
errs_count = 0  # Счётчик ошибок. Комментарий может располагаться на нескольких
                # строках, но все строки относятся к инструкции присваивания.
# Новый комментарий с другим уровнем отступов принадлежит текущему блоку
# исходного кода, но уже не относится к какой-либо конкретной инструкции.
errs_count = errs_count + 1  # Комментарий к операции увеличения счётчика.
echo(errs_count)             # Несмотря на одинаковый уровень отступа, этот комментарий
                             # относится уже к выводу значения счётчика.

Иногда возникают ситуации, когда выравнивание многострочных комментариев по первой строке крайне неудобно из-за недостатка места. В таких случаях можно завершить первую строку комментария символом "обратный слэш" (\), чтобы получить возможность разместить следующую строку комментария наиболее удобным образом. Пример многострочного комментария с допустимым смещением показан в листинге 5.

Листинг 5. Использование обратного слэша для более удобного размещения многострочного комментария
total_ball = average_ball + project_ball * complex_coeff - errs_count  # Здесь \
             # символ обратный слэш позволяет получить больше места для размещения
             # многострочного комментария. Теперь все последующие строки можно
             # выравнивать по второй строке.

Комментарии, предназначенные для генерации документации, начинаются с двух символов ##.

3. Конструкция case

Если требуется выбрать один из нескольких вариантов, то кроме конструкции if elif else можно воспользоваться конструкцией case, более удобной в тех случаях, когда имеются варианты, для которых предусматривается один и тот же набор соответствующих инструкций. Работа конструкции case продемонстрирована в листинге 6.

Листинг 6. Выбор варианта с помощью конструкции case
echo("Какой месяц вы считаете наилучшим для отдыха?")
let month = readLine(stdin)
case month
of "":
  echo("Конечно, можно обходиться и без отдыха.")
of "декабрь", "январь", "февраль":
  echo("Чистый снег, морозный воздух, лыжи и коньки - это здорово.")
of "март", "апрель", "май":
  echo("Действительно, весной нужно восстановиться после долгой зимы.")
of "июнь", "июль", "август":
  echo("Лето, море и солнце - наилучший выбор.")
of "сентябрь", "октябрь", "ноябрь":
  echo("Но ", month, " скорее годен для работы, чем для отдыха.")
else:
  echo("Такого месяца не существует. Наверное, вы ошиблись при вводе.")

Из фрагмента, приведённого в листинге 6, можно понять, что в одной ветви выбора of можно записать несколько вариантов, разделяя их запятыми. В качестве вариантов выбора допустимыми являются строки и целочисленные значения.

Следует обратить внимание на особый вариант в первой ветви выбора of. Две двойные кавычки "" обозначают пустую строку, которая не содержит никаких символов.

4. Конструкция цикла while

Эта самая простая, считающаяся классической, конструкция цикла, разумеется, присутствует и в Nimrod. Пример в листинге 7 иллюстрирует её применение.

Листинг 7. Демонстрация работы цикла while
echo("Введите имя файла в текущем каталоге:")
var fname = readLine(stdin)
while fname == "":
  echo("Для продолжения работы необходимо ввести имя файла в текущем каталоге:")
  fname = readLine(stdin)
  # Здесь используется та же переменная, которая была определена во второй строке

5. Конструкция цикла for

Эта конструкция позволяет организовать цикл со счётчиком, то есть выполнить определённую группу инструкций заданное число раз. В цикле for обязательно должна быть записана переменная, выполняющая функцию счётчика цикла, и так называемый итератор (iterator), управляющий количеством повторений. В примере в листинге 8 показан типичный цикл for.

Листинг 8. Цикл со счётчиком, организованный с помощью конструкции for
echo("Счётчик строк:")
for i in countup( 1, 10 ):
  echo($i, "-я строка.")

В приведённом выше примере особого внимания заслуживает встроенный оператор $, который выполняет преобразование целочисленного значения (и многих других типов) в строку. Для переменной i отдельного объявления не требуется, поскольку она считается неявно объявленной в блоке цикла for и автоматически получает тип int (целое), так как итератор countup возвращает значения именно этого типа.

Последовательный перебор возрастающих числовых значений встречается в программах весьма часто, поэтому в Nimrod имеется специальный итератор .. (две точки), полностью аналогичный итератору countup. Таким образом, вторую строку в листинге 8 можно было бы записать так:

for i in 1..10

6. Ключевое слово continue

Как и во многих других языках программирования, ключевое слово continue позволяет немедленно перейти к началу следующей итерации без выполнения оставшейся части тела цикла. С учётом этого пример из листинга 7 можно переписать так, как показано в листинге 9.

Листинг 9. Использование ключевого слова continue
echo("Введите имя файла в текущем каталоге:")
while true:
  let fname = readLine(stdin)
  if fname == "": continue
  echo("Вы уверены, что надо открыть файл ", fname, "?")

7. Ключевое слово break

Команда break позволяет немедленно выйти из тела циклов while, for, а также из блока (об этом речь пойдёт несколько позже). В самой простой форме использование ключевого слова break показано в листинге 10.

Листинг 10. Использование ключевого слова break
while true:
  echo("Введите имя файла в текущем каталоге:")
  let fname = readLine(stdin)
  if fname == "": continue
  echo("Вы уверены, что надо открыть файл ", fname, "?")
  let answ = readLine(stdin)
  case answ
  of "No", "no", "Нет", "нет": break
  else:
    echo("Открывается файл ", fname, "...")
  # работа программы продолжается в бесконечном цикле
  echo("Для завершения работы программы нажмите Ctrl+\\")

Заключение

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


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=855833
ArticleTitle=Язык программирования Nimrod: Часть 3. Конструкции управления потоком выполнения
publish-date=01222013