Comments 14
Можно ли реализовать мультиязыковой вариант библиотеки?
Например, одновременно иметь
val rest = 1.5.kg - 200.g
и
val остаток = 1.5.кг - 200.г
Идентификаторы на национальном языке (например - на русском) позволяет делать сам Котлин.
Реализовать версию библиотеки, когда функции -расширения будут, например, на русском, очень просто.
Если вам нужно использовать немного величин - проше сделать их вручную по образу и подобию существующих. Если вы хотите повторить на русском всю библиотеку - посмотрите как она генерируется (пакет generator).
Будут вопросы - обращайтесь ко мне в личке.
можно файл руками написать добавку к библиотеке, через расширения
val Int.кг: Kilogramm
get() = this.kg
Но поддерживать сорцы на двух языках тот еще выстрел в ногу
к сожалению все кодировки поддерживают только английский текст, и коды английских букв в большинстве кодировок - одинаковы. Русский текст имеет свойство превращаться в крякозябы
Как это реализовано в библиотеке можно посмотреть в исходниках.
В итоге, похоже, нам остаётся один вариант: использовать функции - расширения.
Или использовать операцию умножения, которая здесь очень подходит по смыслу. Например, если понимать обозначение «кг» как синоним величины «1 кг», а «м³» — как синоним «1 м³» (то есть «1 м ⋅ 1 м ⋅ 1 м»), то можно весьма вольно обращаться с числами и единицами измерения:
20*(kg/m3) == (20*kg)/m3 == (20*kg/m)/m2
Так, кстати, сделано в Boost.Units.
Тем самым наше пространство является кандидатом на звание абелевой группы, да поправят меня математики среди наших читателей, если это не так.
Это пространство действительно является абелевой группой, но только по умножению. Такие группы называют мультипликативными (хотя это не определение, а договоренность — если обозначаем групповую операцию как умножение, нейтральный элемент как единицу и т. д., то принято говорить «мультипликативная»). Поскольку складывать можно не любые элементы (а только элемент сам с собой), то группы по сложению не образуется, и, следовательно, никакое поле тоже не получается.
Использование в формулах функций типа синуса или интеграла мы опускаем, поскольку они определены над безразмерными величинами.
Синус и другие тригонометрические функции, действительно, можно применять только к безразмерным величинам, но вот интегрирование и дифференцирование работает как, соответственно, умножение и деление. Дифференциал действует как аддитивная операция, поэтому размерности не меняет (dx имеет ту же размерность, что и x). Подынтегральное выражение «чисто случайно» записывается как умножение одной величины на дифференциал другой. Аналогично, запись дифференцирования тоже «чисто случайно» записывается как отношение дифференциалов двух величин. На самом деле такая нотация конечно же не случайна, в этом есть большой смысл.
Также размерной является операция скалярного умножения векторов, для этого необходимо, чтобы все компоненты вектора имели одинаковый тип (но у перемножаемых векторов типы могут быть разными).
Спасибо. На эту тему есть тикет https://github.com/vsirotin/si-units/issues/4
Если Вы там сформулируете требования,буду очень признателен. А если и имплементируете, будет совсем замечательно.
Не знаю, как работает конкретно Котлин, но сюда просится параметрический полиморфизм: для любой функции типа R->R строится естественное отображение в функцию, переводящую величину нулевой размерности в величину того же типа. В худшем случае это синтаксически будет выражаться как (map' f v), где map' — это вышеупомянутое отображение (и только его нужно реализовать), хотя, конечно, изящней было бы писать просто (f v), но для этого, кажется, придется каждую функцию f: R->R перегружать, что явно неудобно.
Получается, что создатели языков благосклоннее относятся к инфиксным операциям нежели к префиксным и суффиксным. Так, например, в Котлине можно определять инфиксные собственные функции, а вот префиксные и постфиксные - нет (см. здесь)
Так что пока в KotUniL обходимся без постфиксных функций.
Тогда как это работает? Насколько я понял, писать (1 m) не получится, потому что нет пользовательских постфиксных операций, но как работает синтаксис (1.m)? Я бы сказал, что такой записи вижу постфиксную операцию m, примененную к числовому литералу (1.). А если вместо литерала будет переменная числового типа?
Магия размерностей и магия Котлина. Часть третья: Смешение магий