Logo

28 декабря 2013 г.

Цикл с параметром как итератор

Представленные ранее циклы «пока» и «до» — чисто алгоритмические конструкции, их описание не вызвало затруднений. В отношении цикла с параметром, напротив, высказана гипотеза, что данный цикл является не просто итератором, но алгоритмической формой запроса, по смыслу аналогичного оператору SQL select. В настоящий момент концепция прорабатывается, поэтому статья носит предварительный характер.

На момент написания статьи принято, что оператор for в декларативном синтаксисе может являться аналогом оператора select в командном синтаксисе, при условии, что оператор select также имеется в языке Кантор.

Итератор вместо счетчика

В практическом программировании цикл с параметром чаще всего используется для обхода контейнеров — в качестве итератора. Язык Кантор ориентирован на контейнеры, поэтому для цикла с параметром форма итератора принята в качестве основной. Синтаксис for в Канторе близок к for из PL/SQL и больше похож на foreach в некоторых языках программирования, нежели на традиционный for со счетчиком. Простой счетчик, если потребуется, будет представлен как виртуальный (пустой) контейнер, не содержащий ничего, кроме индексов.

Опора на итератор однозначно решает вопрос видимости внутренней переменной цикла, соответствующей текущему элементу: объявление переменной в Канторе является частью оператора цикла, а сама переменная — локальным именем внутри него, снаружи она не видна.

Простой перебор

Как уже говорилось, цикл for в Канторе восходит к PL/SQL:
for элемент in контейнер do
  ветвь;
end;
Внутренняя переменная элемент имеет тип элемента контейнера — выводится компилятором. Поддержка итераций реализуется контейнером через множественное наследование, как конкретно — будет проработано в дальнейшем.

Перебор нескольких контейнеров

Один из архитектурных принципов языка Кантор — множественность шагов цикла, что уже позволило реализовать цикл Дейкстры и цикл «паук». Применение принципа к циклу с параметром вполне логично ведет к возможности перебора нескольких контейнеров одним оператором, примерно так:
for элемент1 in контейнер1, элемент2 in контейнер2, элемент3 in контейнер3 do
  ветвь;
end;
Сложность в том, что в арифметике контейнеров такая запись соответствует декартову произведению и на практике требуется довольно редко. Кроме того, контейнеры в Канторе имеют собственные итераторы — inner и outer — для обхода деревьев и графов соответственно. Выражения контейнерной арифметики могут также содержать блоки условий where и агрегатных функций. С этой точки зрения декартово произведение в for выглядит весьма спорно, поэтому данная конструкция пока не утверждена.

Стои́т также вопрос, останется ли вообще оператор select, принятый в Канторе на ранних этапах, в виде самостоятельного оператора, или же ключевое слово select уйдет из языка, уступив место обычным выражениям в простых случаях и блокам with, в том числе with с for — в сложных? На этот вопрос пока нет однозначного ответа, понятно лишь, что имеется тесная взаимосвязь select, for и контейнерной арифметики. Решение по ним будет приниматься комплексно.

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.