Для хардкорной математики очень нужны странные фичи
1. Именованные туплы, а лучше именование параметров Generic'ов:
func() : (a:int * b:int * color:int)
{
def x = new { a = 5, b = 20, color=30 };//тут по пальцам если вместо a и b указаны x и y, идеально если ещё и порядок не важен
x;
}
//использование
def r = func();
Console.WriteLine(r.a);
Console.WriteLine(r.b);
Console.WriteLine(r.color);
Основная цель этой фичи — не завязываться на порядок возвращаемых значений ни в самой функции, которая может быть очень большой, ни вне её, а работать только с именами.
2. Сильная типизация алиасов, с типизацией индексов массивов:
type Idx = int;
type Idy = int;
type Idz = int;
//объявление двумерного ступенчатого массива, с индексаторами Idx, Idy и типом значения Idz
def a : array[(dimension1 : Idx) array[(dimension2 : Idy) Idz]];
//тут компилятор даст по пальцам, т.к. у массива типы не int
a[5][10] = 20;
//тут ок, т.к. у массива индексаторы правильных типов, и значение тоже правильного типа
a[5:Idx][10:Idy] = 20:Idz;
def iX = 1 : Idx;
def iY = 2 : Idy;
//с этого момента iX и iY - самостоятельные типы,
//которые к int приводятся только через операторы : и :>
//соответственно встроенные операторы сложения вычитания и т.п.
//тоже начинают понимать только значения правильного типа
Console.WriteLine(a[iX][iX]);//ошибка компиляции, второй индекс должен быть типа Idx;
Console.WriteLine(a[iX][iY]);//всё ок
Цель — снижение числа трудных математических ошибок. У математиков индексов много, каждый индекс нельзя путать с другими. Они важны, как в физике размерности. Ошибки индексации могут быть совершенно неочевидны, и ловить их черезвычайно сложно.
Интересует, в каком направлении копать, и насколько сложно эти две задачи реализовать в Н1 (пусть даже ценой поддержания собственной версии компилятора, если больше никому не надо). И огромная просьба учесть нужность этих фич для системы типов Н2.
Также буду благодарен за критику и возможные идеи в данных направлениях.