PascalABC.NET
October 28, 2022

Вся правда о новых диапазонах a..b

В PascalABC.NET с версии 3.6.0 появился новый диапазонный тип. Константы этого типа записываются в виде a..b, что позволяет записывать многие конструкции проще и понятнее.

Применение в условиях

Основное применение нового диапазона - в условиях вида

if x in 1..10 then

что переводится компилятором в код

(x >= 1) and (x <= 10)

Интересным здесь является то, что границы диапазона могут быть вещественными числами:

if x in 2.5..4.5 then

также отлично работает.

Другое применение новых диапазонов - в функциях, по сути требующих диапазон:

var a := Arr(1..10);

сгенерирует массив, заполненный значениями от 1 до 10, а

var c := Random('a'..'z');

сгенерирует случайную букву.

Применение в цикле foreach

Следующим важным применением диапазонов является использование их в цикле foreach:

foreach var x in 1..10 do
  Print(x);

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

Диапазоны как последовательности

В ряде ситуаций диапазоны трактуются как последовательности. Так, код

(1..10).Print

выводит

1 2 3 4 5 6 7 8 9 10

а код

(1..3).Cartesian('a'..'d').Println;

получает последовательность пар вида

(1,a) (1,b) (1,c) (1,d) (2,a) (2,b) (2,c) (2,d) (3,a) (3,b) (3,c) (3,d)

Функциональный подход как замена цикла for

Диапазон может эффективно заменить цикл for в простейших задачах. Например, цикл

for var i:=1 to 9 do
  if i.IsOdd then
    Print(i*i);

естественным образом заменяется на цепочку методов

(1..9).Where(i -> i.IsOdd).Select(x->x*x).Print;

Методы диапазонов

У диапазонов есть методы, позволяющие реверсировать их как последовательности и формировать последовательности с шагом:

(1..9).Reverse.Println;
(1..9).Step(2).Println;

выведет

9 8 7 6 5 4 3 2 1
1 3 5 7 9

Заключение

Новые диапазоны PascalABC.NET позволяют писать компактный, ясный, гибкий и эффективный код.