Редактировать

Новые конструкции в языке

Индексация массивов, списков и строк с конца

Для индексации с конца в одномерных массивах, списках и строках может использоваться конструкция ^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