Сообщение Используйте годные ЯП от 12.08.2025 9:18
Изменено 12.08.2025 9:22 hi_octane
A>Да, их нельзя складывать с друг с другом. Но их можно(нужно) умножать и делить.
A>Таким образом, чтобы написать формулу, которая содержит три величины, нам нужно иметь 3*(5+1)*(5+1) типов данных.
A>То есть 36 типов для результатов умножения (килограмм*метр),
A>И 2*36 типов для деления килограмм/метр и метр/килограмм.
A>То есть, что-то около сотни типов. (Точная цифра =108)
Вместо тысячи слов "почему нельзя", всё сделал Oyster на Nemerle ещё в 2006-м:
Возможности:
1. Независимые типы данных, такие как mass и length. Присвоить один другому нельзя — будет ошибка компиляции.
2. Автоматическое конвертирование величин одной и той же размерности из одной системы единиц в другую. К примеру, присвоив килограммам один грамм, в результирующей переменной (si::mass) обнаружим 0.001. Вычисление коэффициентов преобразования производится в compile time.
3. Контроль за корректностью формул со стороны компилятора. Так, если ускорению попытаться присвоить результат деления длины на время, возникнет ошибка компиляции. С моей точки зрения, это наиболее важное свойство моего кода. Особенно это заметно на трехэтажных формулах, где очень легко потерять из виду, какая же в результате получается размерность. В случае использования моего кода подобного рода ошибки полностью исключаются.
Пример:
def m3 = 1 g;
def m4 = Si.Mass(m1);
WriteLine($"Mass in SI: $m4, in CGS: $m3");
def x1 = Si.Area(1 cm * 10 m);
WriteLine($"Area of 1 cm * 10 m = $x1 m")
A>Да, их нельзя складывать с друг с другом. Но их можно(нужно) умножать и делить.
A>Таким образом, чтобы написать формулу, которая содержит три величины, нам нужно иметь 3*(5+1)*(5+1) типов данных.
A>То есть 36 типов для результатов умножения (килограмм*метр),
A>И 2*36 типов для деления килограмм/метр и метр/килограмм.
A>То есть, что-то около сотни типов. (Точная цифра =108)
Вместо тысячи слов "почему нельзя", всё сделал Oyster на Nemerle ещё в 2006-м:
Возможности:
1. Независимые типы данных, такие как mass и length. Присвоить один другому нельзя — будет ошибка компиляции.
2. Автоматическое конвертирование величин одной и той же размерности из одной системы единиц в другую. К примеру, присвоив килограммам один грамм, в результирующей переменной (si::mass) обнаружим 0.001. Вычисление коэффициентов преобразования производится в compile time.
3. Контроль за корректностью формул со стороны компилятора. Так, если ускорению попытаться присвоить результат деления длины на время, возникнет ошибка компиляции. С моей точки зрения, это наиболее важное свойство моего кода. Особенно это заметно на трехэтажных формулах, где очень легко потерять из виду, какая же в результате получается размерность. В случае использования моего кода подобного рода ошибки полностью исключаются.
Пример:
def m3 = 1 g;
def m4 = Si.Mass(m1);
WriteLine($"Mass in SI: $m4, in CGS: $m3");
def x1 = Si.Area(1 cm * 10 m);
WriteLine($"Area of 1 cm * 10 m = $x1 m")