You are viewing beroal

язык, на котором не говорят - императивный цикл [entries|archive|friends|userinfo]
beroal

[ website | personal website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

императивный цикл [Oct. 18th, 2013|09:59 pm]
Previous Entry Add to Memories Share Next Entry
Блок-схема императивного цикла изображена на рисунке.

(исходник TikZ-PGF)

B выполняет выход из цикла при условии, C0 выполняется от входа в цикл до B, C1 выполняется от B до входа в цикл. Эту блок-схему можно изобразить в виде Си-подобного кода:
loop {
	C0;
	breakif B;
	C1;
}

Такая синтаксическая конструкция обобщает конструкции «while …» (C0 пустая), «do … while» (C1 пустая), «break». Почему бы не вставить в язык программирования сразу общий случай?
LinkReply

Comments:
[User Picture]From: wizzard0
2013-10-18 10:59 pm (UTC)

(Link)

можно ли цинично утверждать, что goto в данном случае - еще более общий случай? ;)
[User Picture]From: beroal
2013-10-19 09:46 am (UTC)

(Link)

Разумеется. Но он выходит за рамки понятия «цикл», поэтому выходит за рамки темы. ;-)
[User Picture]From: bytebuster463
2013-10-19 04:29 am (UTC)

(Link)

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

superif(i<0) { doSomething1(); } { doSomething2(); }

на практике же, это были бы пустые скобки:

superif(i<0) { doSomething1(); } {}

или

superif(i<0) {} { doSomething2(); }

**Каждый** раз, когда такой superif встречался бы в коде.

Чтобы не писать лишние скобки, каждый программист писал бы заглушки-макросы под себя:

superifOnlyC0 condition body = superif condition {} body

superifOnlyC1 condition body = superif condition body {}

Легко заметить, что superifOnlyC0 = do...while
и superifOnlyC1 = while


Более того. Рассмотрим типы трёх аргументов.
B - понятно, bool.
А для C0 и C1 - не так просто. Если C0 имеет тип 'T, то C1 должен иметь тип 'T -> 'U.
Это означает, что в C0 должна быть инструкция return, которая вовсе не return, а просто передача некоего результата вычисления в C1.

И ещё раз более того.
В императивных языках C0 вполне может определять переменные. Которые C1 очень даже захочет использовать, не обременяясь передачей через return.
Но C0 и C1 имеют разные области видимости. Они окружены каждая своими фигурными скобками.

В общем, гемор ещё тот.
[User Picture]From: beroal
2013-10-19 10:00 am (UTC)

(Link)

Во-первых, вы используете не мой, а свой синтаксис. Из-за этого появляются пустые скобки и другой «гемор».

Во-вторых, вы полагаете, что программисты используют только «while …» и «do … while» «на практике». Ну, у каждого своя практика, я с этим не согласен. Собственно, «for» является контраргументом.

C0 и C1 — это команды. Тип их домена и кодомена — произведение типов локальных переменных. B играет разные роли в блок-схеме и текстовом коде, но я уже не обращаю внимания на эти мелочи.
[User Picture]From: bytebuster463
2013-10-19 10:12 am (UTC)

(Link)

Я хотел обобщить. Прошу прощения, если не в том направлении, куда, как мне показалось, шла Ваша мысль.

Если принять Ваш код за абсолютную константу, то тогда первый комментарий является ответом. :)
[User Picture]From: beroal
2013-10-19 10:49 am (UTC)

(Link)

как мне показалось, шла Ваша мысль

Нет. Рассматривать команды как функции между состояниями имеет смысл только в семантике. В синтаксисе предпочитают манипулировать переменными (элементами состояния). Даже в языках функционального программирования предпочитают это, а не композицию морфизмов, произведение морфизмов, проекции.
[User Picture]From: geniepro
2013-10-19 05:49 pm (UTC)

(Link)

Так есть же уже!

while(1){
C0;
if (B) break;
C1;
}
[User Picture]From: beroal
2013-10-20 10:04 am (UTC)

(Link)

Я предлагаю убрать остальные синтаксические конструкции.