Skip to content

lawref.units

Алгебра размерностей §49.1–§49.2 (errata E-0136, DECISION-0154).

Значение Magnitude — точный рациональный коэффициент и канонический мультимножитель ПРОСТЫХ единиц. Размерность и масштаб здесь ВЫЧИСЛЯЮТСЯ по реестру объявлений, а не хранятся в значении: второй источник истины разошёлся бы с реестром молча (§49.1).

Канон идентичности — чистая функция мультимножителя и НИКОГДА не разбирается обратно: имя базовой единицы само может содержать подчёркивание (ft_per_half_min), и грамматика «база _per_ база» неоднозначна. Отсюда же следует, что литерал Magnitude не входная поверхность — переход делает терм magnitude(q).

Реализация опирается ТОЛЬКО на int и Fraction: Decimal зависит от контекста, а коэффициент величины обязан быть точным при любой разрядности (полномочие владельца: BigInt только для новых операций).

Attributes

NameDescription
BASE_DIMENSIONSNo description.
DIMENSIONLESSNo description.

Classes

NameDescription
MagЗначение Magnitude: коэффициент и мультимножитель простых единиц.
UnitErrorОтказ алгебры размерностей; code — машинный код issue (§49.1).

Functions

NameDescription
canonИдентичность составной единицы §49.1 — ЧИСТАЯ функция мультимножителя.
combineПроизведение либо частное величин (§58.1): показатели складываются
convertЯвная конверсия внутри размерности (§259.1).
dimensionВектор показателей по семи базовым SI (§49.1).
expandИмя единицы → мультимножитель ПРОСТЫХ единиц (§49.2).
exponentПоказатель ПРОСТОЙ единицы name в мультимножителе величины (§259.1,
factors_textМультимножитель для сообщения об отказе: ft2^1, ft^2·s^-1 (E-0151).
magКонструктор канона: нулевые показатели сняты, имена по возрастанию байтов.
projectВеличина алгебры → коэффициент в ЗАЯВЛЕННОЙ единице (§259.1).
promoteQuantity[tag] → Magnitude (§259.1): тег разрешается в реестре.
same_unitТождество идентичности единицы (§58.1): сложение, вычитание и сравнение.
scalarВеличина НУЛЕВОЙ размерности → точный Rational (§259.1).
scaleТочный масштаб мультимножителя к произведению базовых единиц (§49.1).
unit_tableИндекс unit_decl по ИМЕНИ единицы (§49.2).

BASE_DIMENSIONSattributemodule attribute#

BASE_DIMENSIONS = ('Length', 'Mass', 'Time', 'Current', 'Temperature', 'Amount', 'Luminosity')

DIMENSIONLESSattributemodule attribute#

DIMENSIONLESS = (0) * len(BASE_DIMENSIONS)

Magclassdataclass#

class Mag(coeff: Fraction, factors: tuple[tuple[str, int], ...])

Значение Magnitude: коэффициент и мультимножитель простых единиц.

factors — кортеж пар (имя простой единицы, ненулевой показатель), отсортированный по имени: канон держится КОНСТРУКТОРОМ mag, а не договорённостью вызывающих.

coeffattributeinstance attribute#

coeff: Fraction

factorsattributeinstance attribute#

factors: tuple[tuple[str, int], ...]

UnitErrorclass#

class UnitError(code: str, message: str)

Bases: Exception

Отказ алгебры размерностей; code — машинный код issue (§49.1).

codeattributeinstance attribute#

code = code

messageattributeinstance attribute#

message = message

canonfunction#

def canon(factors: tuple[tuple[str, int], ...]) -> str

Идентичность составной единицы §49.1 — ЧИСТАЯ функция мультимножителя.

Показатель в записи — модуль; знак решает половину. Пустой числитель печатается 1: безразмерная величина остаётся величиной, а не числом (число извлекает scalar_of).

combinefunction#

def combine(left: Mag, right: Mag, divide: bool) -> Mag

Произведение либо частное величин (§58.1): показатели складываются (вычитаются), нулевые снимаются, коэффициенты считаются точно.

convertfunction#

def convert(table: dict[str, dict[str, Any]], value: Mag, target: str) -> Mag

Явная конверсия внутри размерности (§259.1).

dimensionfunction#

def dimension(table: dict[str, dict[str, Any]], factors: tuple[tuple[str, int], ...]) -> tuple[int, ...]

Вектор показателей по семи базовым SI (§49.1).

Размерность ПРОСТОЙ единицы — сама произведение базовых: у литра это Length^3. Без произведения децилитр был бы невыразим вовсе — масштаб 1/10 от литра не сводится к целой степени простой длины, а множителя у производной единицы нет по построению (иначе литр и децилитр получили бы ОДИН мультимножитель и один канон, то есть перестали бы различаться).

expandfunction#

def expand(table: dict[str, dict[str, Any]], name: str, seen: tuple[str, ...] = ()) -> dict[str, int]

Имя единицы → мультимножитель ПРОСТЫХ единиц (§49.2).

Алиас разворачивается в цель, производная — в свои множители, простая — в саму себя. Цикл ловится путём, а не глубиной: сообщение обязано назвать цепочку, иначе автор ищет её вручную.

exponentfunction#

def exponent(table: dict[str, dict[str, Any]], value: Mag, name: str) -> int

Показатель ПРОСТОЙ единицы name в мультимножителе величины (§259.1, errata E-0139). Алиас разрешается к своей простой цели; производная отвергается — у неё нет одного показателя; отсутствующий множитель — 0. Читаются factors, а не строка канона: обратного разбора нет (§49.1).

factors_textfunction#

def factors_text(factors: tuple[tuple[str, int], ...]) -> str

Мультимножитель для сообщения об отказе: ft2^1, ft^2·s^-1 (E-0151). Печатается показатель каждого множителя, включая 1, — иначе запись снова совпала бы с каноном и ничего не различала.

magfunction#

def mag(coeff: Fraction, factors: dict[str, int] | tuple[tuple[str, int], ...]) -> Mag

Конструктор канона: нулевые показатели сняты, имена по возрастанию байтов.

projectfunction#

def project(table: dict[str, dict[str, Any]], value: Mag, target: str) -> Fraction

Величина алгебры → коэффициент в ЗАЯВЛЕННОЙ единице (§259.1).

Обратный ход алгебры, и он ПРОВЕРЯЕМЫЙ, а не перетегировка: мультимножитель величины обязан СОВПАСТЬ с раскрытием названной единицы. 6 N · 50 m даёт {kg:1, m:2, s:-2}, и J раскрывается в тот же набор — заявление принято; напиши автор m, и набор {m:1} не совпадёт, а таран №4 (работа с тегом ДЛИНЫ при статусе TRUE_ONLY) станет громким отказом.

Приведения масштабов здесь НЕТ намеренно: km и m — разные наборы, и перевод остаётся у unit_convert. Иначе проекция молча меняла бы число.

promotefunction#

def promote(table: dict[str, dict[str, Any]], tag: str, value: Fraction) -> Mag

Quantity[tag] → Magnitude (§259.1): тег разрешается в реестре.

Непрозрачные теги права (mrp, business_day, «щелчок») не разрешаются и в алгебру не переходят — это рамка 2 DECISION-0068, а не недоделка.

same_unitfunction#

def same_unit(op: str, left: Mag, right: Mag) -> None

Тождество идентичности единицы (§58.1): сложение, вычитание и сравнение.

Тождество — по МУЛЬТИМНОЖИТЕЛЮ, а не по строке канона (errata E-0151): строка сравнивается первой только ради прежней формулировки отказа.

Отказ называет РОД: разные масштабы ОДНОЙ размерности сюда попадают тем же путём, что разные размерности, и до errata обе половины отвечали одним DIMENSION_MISMATCH — диагностика врала (замер фазы 0, §3 п. 2 DECISION-0154). Здесь код один, но сообщение называет обе единицы, а различение размерности живёт у unit_convert/scalar_of.

scalarfunction#

def scalar(table: dict[str, dict[str, Any]], value: Mag) -> Fraction

Величина НУЛЕВОЙ размерности → точный Rational (§259.1).

scalefunction#

def scale(table: dict[str, dict[str, Any]], factors: tuple[tuple[str, int], ...]) -> Fraction

Точный масштаб мультимножителя к произведению базовых единиц (§49.1).

unit_tablefunction#

def unit_table(nodes: list[dict[str, Any]] | None) -> dict[str, dict[str, Any]]

Индекс unit_decl по ИМЕНИ единицы (§49.2).

Имя, объявленное дважды РАЗНЫМ содержимым, из индекса выбывает: разрешить его пришлось бы порядком узлов, то есть молча выбрать одно из двух объявлений. Дубликат байт в байт (одна декларация, доехавшая двумя путями импорта) схлопывается.

Documentation for Arxo. Writings — blog.arxo.io.

Anonymous visit counts on stats.arxo.io, no cookies.