A runtime dimension-checked physical quantity and unit system for MoonBit.
moon add FrozenLemonTee/LunarUnitsimport {
"FrozenLemonTee/LunarUnits/core/quantity",
"FrozenLemonTee/LunarUnits/units/si",
"FrozenLemonTee/LunarUnits/notation/preset",
"FrozenLemonTee/LunarUnits/notation/parser",
"FrozenLemonTee/LunarUnits/quantities/qgeometry",
}fn main {
// Build quantities with convenience constructors or directly from a unit.
let distance = @qgeometry.meters(100.0)
let time = @quantity.Quantity::new(10.0, @si.second)
// Arithmetic composes units automatically.
let speed = distance / time
println(@quantity.format_quantity(speed))
// The checked API is convenient in `main`: invalid conversions return None.
let in_meters = @qgeometry
.kilometers(2.0)
.checked_to(@si.meter)
.unwrap()
println(@quantity.format_quantity(in_meters))
// Parse a complete quantity without introducing an unhandled error effect.
let catalog = @preset.all()
let gravity = @parser
.parse_quantity_opt(catalog, "9.8 m/s^2")
.unwrap()
println(@quantity.format_quantity(gravity))
// Dimensionally invalid addition is rejected without terminating the program.
println(distance.checked_add(time) is None)
}10 m/s
2000 m
9.8 m/s^2
truecore/
algebra normalized symbolic algebra (Expr, Monomial)
dimension physical dimensions (Dimension)
unit unit definitions and conversion (Un)
quantity values with units (Quantity, DimensionMismatch)
dimensions/
angle_dimension extension dimension for plane angle
solid_angle_dimension extension dimension for solid angle
information_dimension extension dimension for information
currency_dimension extension dimension for money
count_dimension extension dimension for discrete counts
units/
si SI base units
time minute, hour, day, milli/micro/nanosecond (fixed-length durations)
angle radian, degree, turn, arcminute, arcsecond, cycle, hertz
solid_angle steradian, square degree, spat
geometry length, area, volume
mass mass, density
mechanics force, pressure, velocity, energy, power
fluid dynamic/kinematic viscosity, permeability
thermal heat transfer coefficient, conductivity, specific heat, heat
electromagnetism charge, voltage, resistance, capacitance, inductance, flux
information bit, byte and common decimal/binary byte units
currency dollar, cent, k$, M$ (same-currency only)
count each, dozen, gross
quantities/
qtime time-duration constructors (minutes, hours, days, ...)
qangle plane angle constructors, plus cycle and hertz (frequency)
qsolidangle solid angle quantity constructors
qsi SI base quantity constructors
qgeometry geometry quantity constructors
qmass mass and density quantity constructors
qmechanics mechanics quantity constructors
qfluid fluid quantity constructors
qthermal thermal quantity constructors
qelectromagnetism electrical and magnetic quantity constructors
qinformation information quantity constructors
qcurrency currency quantity constructors
qcount discrete-count quantity constructors
constants/
physics common physical constants as quantities
notation/
catalog immutable symbol -> unit lookup table (Catalog)
preset prebuilt catalogs, one per unit package, plus all()
parser parse unit/quantity strings (parse_unit, parse_quantity)
affine/ affine scales (AffineUn, Point) with temperature units
logarithmic/ logarithmic scales (Level, Gain) with decibel/neper units
examples/ runnable, self-checking examples
docs/ design and roadmap notesLinear units/thermal keeps only the kelvin and its linear derivatives. Affine temperature points (°C, °F, °R) live in the separate affine/ package, and logarithmic levels/gains in logarithmic/, so Un/Quantity stay purely multiplicative.
A runtime dimension-checked physical quantity and unit system for MoonBit.