Цикл с выходом из середины
От: igna Россия  
Дата: 22.02.07 08:06
Оценка: 7 (2)
Изобретателям языков программирования (которые судя по теме именованые циклы
Автор: ДимДимыч
Дата: 20.02.07
здесь есть).

Как-то, написав цикл с выходом из середины, я обратил внимание, что если в грамматике правило

    do statement while ( expression ) ;


заменить на

    do statement while ( expression )  statement


, то можно будет писать

    do
        f();
    while (g())
        h();


вместо

    for (;;) {
        f();
        if (!g())
            break;
        h();
    }


Я бы с удовольствием пользовался этой возможностью в любом языке.
Re: Цикл с выходом из середины
От: BokiyIS  
Дата: 22.02.07 08:57
Оценка:
Здравствуйте, igna, Вы писали:

I>Изобретателям языков программирования (которые судя по теме именованые циклы
Автор: ДимДимыч
Дата: 20.02.07
здесь есть).


I>Как-то, написав цикл с выходом из середины, я обратил внимание, что если в грамматике правило


I>
I>    do statement while ( expression ) ;
I>


I>заменить на


I>
I>    do statement while ( expression )  statement
I>


I>, то можно будет писать


I>
I>    do
I>        f();
I>    while (g())
I>        h();
I>


I>вместо


I>
I>    for (;;) {
I>        f();
I>        if (!g())
I>            break;
I>        h();
I>    }
I>


I>Я бы с удовольствием пользовался этой возможностью в любом языке.


Да, но если у нас в таком языке есть while(expr) stmt и do stmt while(stmt), наряду с указаной вами грамматикой, то она является неоднозначной, что при построении компилятора, как мне кажется, не есть хорошо.
Re[2]: Цикл с выходом из середины
От: igna Россия  
Дата: 23.02.07 08:15
Оценка:
Здравствуйте, BokiyIS, Вы писали:

BIS>Да, но если у нас в таком языке есть while(expr) stmt и do stmt while(stmt), наряду с указаной вами грамматикой, то она является неоднозначной, ...


Правда? А на мой взгляд это изменение не добавляет никакой неоднозначности. Хотелось бы узнать мнение экспертов.
Re[3]: Цикл с выходом из середины
От: Roman Odaisky Украина  
Дата: 23.02.07 09:17
Оценка:
Здравствуйте, igna, Вы писали:

BIS>>Да, но если у нас в таком языке есть while(expr) stmt и do stmt while(stmt), наряду с указаной вами грамматикой, то она является неоднозначной, ...


I>Правда? А на мой взгляд это изменение не добавляет никакой неоднозначности. Хотелось бы узнать мнение экспертов.


На мой взгляд, компьютеру не добавляет, но человеку очень даже добавляет.

И, вообще, баян: man perlsyn. Знать бы еще, используется ли это хоть кем-то.
До последнего не верил в пирамиду Лебедева.
Re[3]: Цикл с выходом из середины
От: BokiyIS  
Дата: 23.02.07 09:22
Оценка:
Я конечно не эксперт, но данная грамматика будет давать более чем одно дерева разбора для следующего предложения:
do do S1 while(E1) S2 while(E2) S3
к какому циклу вы отнесете S2, к внутренему или же к внешнему?
Хотя, такие неоднозначности можно устранить, немного переделав грамматику.
Re[4]: Цикл с выходом из середины
От: Roman Odaisky Украина  
Дата: 23.02.07 09:55
Оценка:
Здравствуйте, BokiyIS, Вы писали:

BIS>Я конечно не эксперт, но данная грамматика будет давать более чем одно дерева разбора для следующего предложения:

BIS>do do S1 while(E1) S2 while(E2) S3
BIS>к какому циклу вы отнесете S2, к внутренему или же к внешнему?
BIS>Хотя, такие неоднозначности можно устранить, немного переделав грамматику.

Всё зависит от того, что за символ после «)», закрывающей условие do-while. Сейчас там может быть исключительно «;» (что в предлагаемой грамматике соответствует пустому continue-оператору). Если же там «{» или начинается statement, то это и будет continue-block à la Perl.
До последнего не верил в пирамиду Лебедева.
Re[4]: Цикл с выходом из середины
От: igna Россия  
Дата: 24.02.07 05:48
Оценка:
Здравствуйте, BokiyIS, Вы писали:

BIS>Я конечно не эксперт, но данная грамматика будет давать более чем одно дерева разбора для следующего предложения:

BIS>do do S1 while(E1) S2 while(E2) S3
BIS>к какому циклу вы отнесете S2, к внутренему или же к внешнему?

К внутреннему, между внешними do и while допускается только один statement.
Re: Цикл с else
От: x-code  
Дата: 24.02.07 07:50
Оценка:
Здравствуйте, igna, Вы писали:

I>Изобретателям языков программирования (которые судя по теме именованые циклы
Автор: ДимДимыч
Дата: 20.02.07
здесь есть).


I>, то можно будет писать

I>
I>    do
I>        f();
I>    while (g())
I>        h();
I>


I>вместо


I>
I>    for (;;) {
I>        f();
I>        if (!g())
I>            break;
I>        h();
I>    }
I>


интересно... возможно, изобилие do и while немного запутает программиста при просмотре кода. каждый раз когда видишь while нужно будет думать, есть ли что-то перед ним или это начало цикла while().

Вот вам еще одна идея из моих наработок: часто бывает нужно отработать ситуацию, если цикл не выполнился не разу. Конечно она решается и без нововведений, но раз уж речь зашла об изобретении новых языков...
while(f())
{
  g();
}
else while(h())
{
  i();
}
else
{
  j();
}

еще идея в том, что можно комбинировать else if, else while, else for, else do while в любом порядке
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.