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

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

Срезы многомерных массивов

begin
  var m := Matr(||1,2,3,4|,|5,6,7,8|,|9,10,11,12||);
  Println(m[:,:]);           // [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  Println(m[::1,::1]);       // [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  Println(m[1:3,1:4]);       // [[6,7,8],[10,11,12]]
  Println(m[::2,::3]);       // [[1,4],[9,12]]
  Println(m[::-2,::-1]);     // [[12,11,10,9],[4,3,2,1]] 
  Println(m[^2::-1,^2::-1]); // [[7,6,5],[3,2,1]] 
  Println(m[:^1,:^1]);       // [[1,2,3],[5,6,7]] 
  Println(m[1,:]);           // [5,6,7,8] 
  Println(m[^1,:]);          // [9,10,11,12] 
  Println(m[:,^1]);          // [4,8,12] 
end.  

Лямбда-выражения с распаковкой параметров, являющихся кортежами или последовательностями

Теперь можно давать имена элементам кортежей прямо в параметрах лямбды. Чтобы распаковать параметр-кортеж t в переменные x и y, используется запись \(x,y). Это один параметр в отличие от записи (x,y), представляющей два параметра:

begin
  var s := Seq(('Умнова',16),('Иванов',23),
               ('Попова',17),('Козлов',24));
  Println('Совершеннолетние:');
  s.Where(\(name,age) -> age >= 18).Println;
  Println('Сортировка по фамилии:');
  s.OrderBy(\(name,age) -> name).Println;
end.

Сравним со старым кодом:

begin
  var s := Seq(('Умнова',16),('Иванов',23),
               ('Попова',17),('Козлов',24));
  Println('Совершеннолетние:');
  s.Where(x -> x[1] >= 18).Println;
  Println('Сортировка по фамилии:');
  s.OrderBy(x -> x[0]).Println;
end.

Уточнения в языке

Разрешена конструкция a as array of T

Ранее конструкция a as array of T была запрещена на уровне грамматики. Таким образом, невозможно было выполнить DownCast привести к типу массива. Теперь это ограничение снято

begin
  var ob: object := new integer[2,3];
  var a := ob as array [,] of integer;
end.