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

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Может лучше сделать счетчик в цикле "for" встроенным и необязательным?

Это как ? Пример ?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

debi12345
видимо...

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

For 0..100 do

For count=0..100 do

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

Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

debi12345 писал(а):Это как ? Пример ?


Примерно так

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

 for id:expression do
  statement;
end;

 for i:count do
  ...
 end;

 for count do
  ...
 end;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Mikhail, у любого цикла должны быть условия выхода из него. В твоей записи непонятно где выставляется верхняя граница счетчика.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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


Выражение (expression) задает число повторений тела. Если нужен счетчик, то он указывается явно. Изменяется счетчик от 0 до Count-1. Счетчик (идентификатор) имеет время жизни и область видимости совпадающую с телом цикла.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Mikhail писал(а):Если нужен счетчик, то он указывается явно.


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

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


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

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


для этого варианта понятно (надеюсь правильно), но остальные? Вне цикла счетчик задать еще нельзя (он вне границы видимости), а в цикле уже нельзя (он активно используется). Получается типичный forall
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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


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

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


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

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

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


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

Почему? В качестве счетчика цикла можно использовать любую переменную.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


гемор полный... все же паскалевский вариант очевиднее. Тем более, что вариант когда мне нужен, к примеру, диапазон от 8 до 74, никто не отменял.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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


А когда он нужен?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Mikhail, да мало ли таких ситуаций. Например, при отправке на печать нескольких страниц с середины длинного текста. Если ВЫ не пользуйтесь данной возможностью, то это не значит, что она никому не нужна.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение 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, для реализации выхода из вложенного цикла.
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение 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.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Mikhail писал(а):Нет никаких проблем написать так


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

Сообщение 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.
Позволяет проверить полную систему условий.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


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

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

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


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