Новые конструкции в языке
Индексация массивов, списков и строк с конца
Для индексации с конца в одномерных массивах, списках и строках может использоваться конструкция ^i, где i - индекс элемента, отсчитывааемый с конца (начиная с 1). Например, ^1 - индекс последнего элемента, ^2 - индекс предпоследнего и т.д.
begin
var a := Arr(1..10);
Print(a[^1]); // последний элемент
a[^2] := 777; // второй от конца элемент
end.
Тип конструкции ^i - SystemIndex, он хранит число и флаг, указывающий, присутствует ли в записи ^.
Срезы с использованием конструкции ^1
begin
var a := Arr(1..10);
Print(a[:^1]); // все кроме последнего
Print(a[^2::-1]); // все с конца, начиная с предпоследнего
end.
Использование срезов в левой части
Срезы могут использоваться в левой части для присваивания части массива, списка, строки
begin
var a := Lst(1..10);
a[2:4] := a[5:7];
a[:^1] := a[1:];
a[::2] := Lst(10..14);
end.
Конструкция эффективна для срезов с шагом, отличным от 1 или -1: обходятся только элементы, участвующие в срезе
Дополнения и изменения в стандартных библиотеках
Методы расширения одномерных массивов a.Permutations и a.Combinations(m) в стандартном системном модуле
a.Permutations возвращает последовательность всех перестановок в лексикографическом порядке. Перестановки возвращаются в виде массивов
a.Combinations(m) возвращает последовательность всех сочетаний по m элементов в лексикографическом порядке. Сочетания возвращаются в виде массивов
begin
Arr(1..4).Combinations(2).Println
end.
возвращает
[1,2] [1,3] [1,4] [2,3] [2,4] [3,4]
Методы Step(n) и Reverse в IntRange, CharRange в стандартном системном модуле
Благодаря этим методам можно записывать циклы следующим образом:
begin
foreach var i in (1..10).Step(2) do
Print(i);
Println;
foreach var i in (1..10).Reverse do
Print(i);
end.
TryRead с приглашением к вводу в стандартном системном модуле
Теперь можно делать приглашение к вводу в TryRead Стандартный шаблон использования:
begin
var i: integer;
while not TryRead(i,'Введите i:') do
Println('Повторите ввод!');
end.
Недостающие обработчики событий в GraphWPF, WPFObjects, Graph3D
Реализованы обработчики OnClose в GraphWPF, WPFObjects, Graph3D, а также обработчик OnDrawFrame в GraphWPF
Функция DrawGraph - улучшение отображения графиков
Переработана DrawGraph в GraphWPF - выводится сетка и координаты
GraphWPF, WPFObjects под Windows XP
GraphWPF, WPFObjects теперь работают под под Windows XP
Уточнения в языке
Разрешены вложенные записи с некоторыми ограничениями
Во вложенных записях разрешено захватывать внешние имена только из глобального контекста:
type int = integer;
var globalr := 2.5;
var globali: integer;
type Class1<T,T1> = class
procedure p;
var
A: record
i: int := globali;
jlocal0: record
k: real := globalr;
end;
end;
begin
end;
end;
begin
end.
Однако следующая программа является ошибочной (захватывается неглобальный тип T):
type Class1<T> = class
A: record
i: T;
end;
end;
begin
end.
Ошибка: Вложенные записи не могут захватывать имена из неглобального контекста
Изменения в интерфейсе
Улучшение поддержки HighDPI
Многочисленные изменения были сделаны для поддержки HighDPI:
- кнопки закрытия окна для разрешения 200%
- улучшение отображения иконок в окне проектов и менеджере компонент в приложении Windows Forms, окнах вывода
Улучшение инсталлятора
В инсталлятор вшита автоматическая проверка установленной версии .NET. Если не установлена версия .NET Framework 4.7.1 и выше, то она скачивается и устанавливается с сайта Microsoft