`For..to..step` ?

Is there a For to step concerning the for loop in PascalABC.Net? I know in Delphi/Object Pascal/Lazarus/FPC one has to resort to alternate syntax such as while, repeat or other hacks.. REMObjects Oxygene uses this syntax which is clean and simple (similar to Visual Basic). :slightly_smiling_face:

for i := 0 to 10 step 2 do 
  DoSomething();
for i := 0 to 10 step 3 do 
  DoSomething();

Существует ли For to step относительно цикла for в PascalABC.Net? Я знаю, что в Delphi/Object Pascal/Lazarus/FPC приходится прибегать к альтернативному синтаксису, такому как while, repeat или другие хаки.. REMObjects Oxygene использует этот синтаксис, который чист и прост (похож на Visual Basic).

Будет существовать со следующей версии, которая сейчас проходит “полировку”.

for var i := a to b step h do
1 лайк

This exact same syntax as you have shown already exists for 4 days. But only as a commit in the source code of the compiler.
You can make your own build to have it working now. I already did that because I wanted to test it.

1 лайк

Раз уж сделали тему - напишу тут. Единственное странное что я нашёл:

##
for var i := 2 to 1 step 1 do Writeln(i);
Writeln('-'*10);
for var i := 2 to 1 step 2 do Writeln(i);

То есть если шаг 1 (или -1) - из пустого диапазона не берёт ни одного значения. А если шаг другой - берёт первую границу. По моему не должно брать ничего в обоих случаях

1 лайк

Да, это баг.

Баг исправили - попроверяйте пожалуйста.

Заодно проверьте новую конструкцию

foreach var x in Arr(1,3,5) index i do
  Println(i,x)

Как можно что-то проверять, когда нет этой сборки?

В общем случае - запустив _GenerateAllSetups.bat из корня репозитория.
Но я думаю это сообщение относилось только ко мне, а у меня свои инструменты для автоматизации сборки.

##
for var i := 3 to 0 step -1 do
begin
  Writeln(i);
  continue;
end;
3
3
3
3
1 лайк
## var step := 0;
for var i := 0 to 3 step step do;

Ошибка пишет не про неправильный step, а про деление на ноль.


Проверил - вы сделали неэффективное условие:

(step > 0 && a2 < a1) ||
(step < 0 && a1 < a2)

Лучше так:

step>0 ? a2<a1 : a1<a2

Не понял. Это ошибка времени исполнения. Там уже нет цикла for с шагом. Поэтому писать ошибку в этих терминах нельзя

Это детали реализации. Тот кто использует паскаль не должен лезть в декомпилированную версию кода и смотреть во что разворачивается цикл for, чтобы понимать ошибки.

2 лайка

В семействе Паскаля такого оператора (цикл с шагом) не имеется.

1 лайк

А теперь будет. Как в его предшественнике - языке Algol.

В сообщении “быт” - нет мягкого знака.

Привет всем. Да, сегодня из сайта скачал новый вариант. Теперь есть цикл с шагом, конечно только порядковым типом. Дробный шаг не имеется. Дробный шаг имеется в семействе бейсика.

Дробный шаг - это отвратительная возможность с точки зрения вычислительной техники. Поскольку числа с плавающей точкой представляются в компьютере приближенно, само понятие “точное равенство” утрачивает строгость. Два достаточно близких по величине числа оказываются равны (либо неравны) с некоторой точностью. Т.е, к примеру, если a = b с точностью 15 знаков мантиссы, то 33a совсем не обязательно будут равны 33b. Все это создает большую головную боль в реализации цикла с нецелым шагом - он вполне может либо недовыполниться один раз, либо перевыполниться.

1 лайк

I just submitted some code examples to Rosetta Code which included For-Loop-Step examples (in another language). Yes, it’s true some variants of Basic support fractional steps such as True Basic because they only have a numeric type and do not distinguish between integers and real numbers. But I’m in agreement with RAlex, it’s best to have an integer type for step values. As an aside, I believe it would perhaps be beneficial for the creators of PascalABC.Net to submit code examples to show its unique capabilities especially when compared to other Pascal variants. In the link to Rosetta Code, you can see that Pascal is listed but is redirected to Delphi which self-admittedly does not support a step feature. Yes, there would be a lot of code examples to submit. But wouldn’t it be an interesting project for Southern Federal University students? :wink:

Я только что отправил несколько примеров кода в Rosetta Code, которые включали примеры For-Loop-Step (на другом языке). Да, это правда, что некоторые варианты Basic поддерживают дробные шаги, такие как True Basic, потому что они имеют только числовой тип и не различают целые и действительные числа. Но я согласен с RAlex, лучше иметь целочисленный тип для значений шага. В качестве отступления, я считаю, что создателям PascalABC.Net, возможно, было бы полезно представить примеры кода, чтобы показать его уникальные возможности, особенно по сравнению с другими вариантами Pascal. В ссылке на Rosetta Code, вы можете увидеть, что Pascal указан в списке, но перенаправляется на Delphi, который, по собственному признанию, не поддерживает функцию шага. Да, пришлось бы приводить много примеров кода. Но не будет ли это интересным проектом для студентов Южного федерального университета?

а чем оператор while не угодил?