Страница 10 из 23

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 16:41:45
debi12345
Может лучше сделать счетчик в цикле "for" встроенным и необязательным?

Это как ? Пример ?

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 16:54:56
Лекс Айрин
debi12345
видимо...

Код: Выделить всё

For 0..100 do

For count=0..100 do

//где count это встроенный оператор


Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 17:34:52
Mikhail
debi12345 писал(а):Это как ? Пример ?


Примерно так

Код: Выделить всё

 for id:expression do
  statement;
end;

 for i:count do
  ...
 end;

 for count do
  ...
 end;

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 17:39:28
Лекс Айрин
Mikhail, у любого цикла должны быть условия выхода из него. В твоей записи непонятно где выставляется верхняя граница счетчика.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 17:43:51
Mikhail
Лекс Айрин писал(а):Mikhail, у любого цикла должны быть условия выхода из него. В твоей записи непонятно где выставляется верхняя граница счетчика.


Выражение (expression) задает число повторений тела. Если нужен счетчик, то он указывается явно. Изменяется счетчик от 0 до Count-1. Счетчик (идентификатор) имеет время жизни и область видимости совпадающую с телом цикла.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 18:20:29
Лекс Айрин
Mikhail писал(а):Если нужен счетчик, то он указывается явно.


как бы, в цикле for счетчик нужен почти всегда.

Mikhail писал(а):Счетчик (идентификатор) имеет время жизни и область видимости совпадающую с телом цикла.


На вопрос о вложенных циклах ответа, как я понимаю, нет...

Mikhail писал(а):Выражение (expression) задает число повторений тела.


для этого варианта понятно (надеюсь правильно), но остальные? Вне цикла счетчик задать еще нельзя (он вне границы видимости), а в цикле уже нельзя (он активно используется). Получается типичный forall

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 18:26:50
Mikhail
Лекс Айрин писал(а):как бы, в цикле for счетчик нужен почти всегда.


Мой опыт говорит о другом.

Лекс Айрин писал(а):На вопрос о вложенных циклах ответа, как я понимаю, нет...


Никаких проблем

Код: Выделить всё

for expression1 do
 ...
 for expression2 do
  ...
 end;
...
end;


Лекс Айрин писал(а):для этого варианта понятно (надеюсь правильно), но остальные? Вне цикла счетчик задать еще нельзя (он вне границы видимости), а в цикле уже нельзя (он активно используется). Получается типичный forall

Почему? В качестве счетчика цикла можно использовать любую переменную.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 18:35:09
Лекс Айрин
Mikhail писал(а): В качестве счетчика цикла можно использовать любую переменную.


гемор полный... все же паскалевский вариант очевиднее. Тем более, что вариант когда мне нужен, к примеру, диапазон от 8 до 74, никто не отменял.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 18:36:30
Mikhail
Лекс Айрин писал(а):гемор полный... все же паскалевский вариант очевиднее. Тем более, что вариант когда мне нужен, к примеру, диапазон от 8 до 74, никто не отменял.


А когда он нужен?

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 18:44:27
Лекс Айрин
Mikhail, да мало ли таких ситуаций. Например, при отправке на печать нескольких страниц с середины длинного текста. Если ВЫ не пользуйтесь данной возможностью, то это не значит, что она никому не нужна.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 19:58:20
Mikhail
Лекс Айрин писал(а):Mikhail, да мало ли таких ситуаций. Например, при отправке на печать нескольких страниц с середины длинного текста. Если ВЫ не пользуйтесь данной возможностью, то это не значит, что она никому не нужна.


Вопрос в %. Если это нужно в 0,0000000001% случаев, то вносить эту возможность в конструкцию языка не стоит. Нет никаких проблем написать так

Код: Выделить всё

page:=8;
for count do
 ...
 page:=page+1;
end;


или

Код: Выделить всё

startpage:=8;
for i:count do
 page:=startpage + i;
 ...
 
end;


Добавлено спустя 1 час 5 минут 35 секунд:
Есть идея.
Можно отказаться от оператора continue. А оператор break разрешить только внутри тела бесконечного цикла loop end.
Причем, в отличие от Oberon, запретить break даже в случае если один из структурных циклов вложен в цикл loop end. Возможно введение специальной метки (опционально) для бесструктурного цикла loop end, для реализации выхода из вложенного цикла.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 19:59:35
mse
Mikhail писал(а):

Код: Выделить всё

if a>1 then 
 ...
 elsif a<10 then
 ...
 elsif c>3 then
 ...
 else
 ...
 end;

Can you give a real example where "elseif" is much better than nested "if"s or "case"?

debi12345 писал(а):Some ideas:
1)

Код: Выделить всё

for i in <from>..<to> [BY <STEP>] ..

- Possibly with float <from>, <to> and <step>

Why?
2) changing "do" to ":" & throwing away "end;" we'll come to Python-like syntax w / o any stuff (useless) keywords

Mandatory "end;" is not useless. It clarifies code structure.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 20:28:18
Лекс Айрин
Mikhail писал(а):Нет никаких проблем написать так


Тоесть, существенно усложнять программу, вводя дополнительные инструкции там, где это не нужно? Да многие, особенно начинающие, начинают отсчет не с нуля, а с единицы. И это вполне оправдано текущими задачами. Подобный финт очень упрощает задачу -- потом не надо вводить "волшебную" операцию -/+1. Сам недавно мучался в TMemo из-за того, что отсчет с нуля идет.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 20:55:42
Mikhail
mse писал(а):Can you give a real example where "elseif" is much better than nested "if"s or "case"?

if [elsif expr then ]* [else] end; это наиболее общая форма оператора множественного выбора.
В частном случае это классический if then else end. Или оператор обхода if then end.
case это частный случай if then [elsif expr then ]* [else] end; Позволяет создать эффективную таблицу переходов если ключ выбора целочисленный.

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

Добавлено спустя 4 минуты 46 секунд:
Лекс Айрин писал(а):Тоесть, существенно усложнять программу, вводя дополнительные инструкции там, где это не нужно? Да многие, особенно начинающие, начинают отсчет не с нуля, а с единицы.


Существенно? :D

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

PS Кстати в Delphi тоже так решили, так что привыкайте.

Добавлено спустя 21 минуту 21 секунду:
Для Мартина. Кроме того, elsif решает проблему "висячего" else.
Позволяет проверить полную систему условий.

Re: MSElang : обсуждение фишек

Добавлено: 15.11.2013 20:59:45
Лекс Айрин
Mikhail писал(а):в котором решено все, и массивы и строки индексировать с нуля, для избежания путаницы.


Но выполнима ли эта задача.
Mikhail писал(а):Существенно? :D

Если это увеличивает возможность ошибки, то очень.

Mikhail писал(а):Кстати в Delphi тоже так решили, так что привыкайте.


Не пользовался.