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/constants/physics",
"FrozenLemonTee/LunarUnits/notation/preset",
"FrozenLemonTee/LunarUnits/notation/parser",
"FrozenLemonTee/LunarUnits/affine",
"FrozenLemonTee/LunarUnits/logarithmic",
"FrozenLemonTee/LunarUnits/quantities/qgeometry",
"FrozenLemonTee/LunarUnits/quantities/qinformation",
"FrozenLemonTee/LunarUnits/quantities/qmechanics",
}// 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 // 10 m/s
let speed_text = @quantity.format_quantity(speed) // "10 m/s"
// Newton's second law: F = m * a.
let mass = @quantity.Quantity::new(2.0, @si.kilogram)
let acceleration = @quantity.Quantity::new(3.0, @si.meter / @si.second.pow(2))
let force = mass * acceleration // 6 N
// Same-dimension conversion keeps the physical magnitude.
let in_meters = @qgeometry.kilometers(2.0).to(@si.meter)
// in_meters.value() == 2000.0
// Domain constructors are just shorthand for Quantity::new(value, unit).
let load = @qmechanics.newtons(6.0)
// Constants and extension dimensions are ordinary quantities too.
let light_second = @physics.speed_of_light * @quantity.Quantity::new(1.0, @si.second)
let memory = @qinformation.kibibytes(1.0)
// Resolve unit symbols through a catalog, or parse whole expressions.
let catalog = @preset.all()
let newton_unit = catalog.lookup("N").unwrap() // the newton, from its symbol
let accel_unit = @parser.parse_unit(catalog, "m/s^2") // composed from a string
let g = @parser.parse_quantity(catalog, "9.8 m/s^2") // value 9.8, unit m/s^2
// Temperature is an affine scale: absolute points convert with an offset.
let body = @affine.Point::new(37.0, @affine.celsius)
let body_k = body.to_base() // 310.15 K, as a linear Quantity
// Dimensionally invalid operations are rejected: `add`/`sub`/`to` raise
// `DimensionMismatch` when the dimensions do not match. Use `checked_*`
// variants when you prefer `None` over raising.
let total = distance.add(time) // raises DimensionMismatch
let maybe_total = distance.checked_add(time) // Nonecore/
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.