22 · Temporal Expressions
Dimensions and unit scales
Declare base units, derived dimensions and exact scales with @unit. Multiplication and division derive dimensions; as converts only compatible dimensions and checks representability. Duration suffixes retain ordinary millisecond behavior outside a dimensional context.
On this page
Declare base units, derived dimensions and exact scales with @unit. Multiplication and division derive dimensions; as converts only compatible dimensions and checks representability. Duration suffixes retain ordinary millisecond behavior outside a dimensional context.
Complete example
Dimensions and unit scales.
dimensional_units.zolo
// Exact dimensional scales; standalone durations retain milliseconds.
@unit("m", base: true) newtype Meters(decimal) where |v| v >= 0d
@unit("km", of: Meters, scale: 1000d) newtype Kilometers(decimal)
@unit("s", base: true, duration: true) newtype Seconds(decimal)
@unit("h", of: Seconds, scale: 3600d, duration: true) newtype Hours(decimal)
@unit("kph", dimension: Kilometers / Hours) newtype Kph(decimal)
@unit("kmh", dimension: Kilometers * Hours) newtype Kmh(decimal)
fn main() {
let distance = 2km as Meters
assert(distance.unwrap() == 2000d)
print(distance.unwrap())
let speed = 80km / 2h
let displayed = speed as Kph
assert(displayed.unwrap() == 40d)
print(displayed.unwrap())
let covered = (speed * 2h) as Kilometers
assert(covered.unwrap() == 80d)
print(covered.unwrap())
let reverse = (2h * 80km) as Kmh
assert(reverse.unwrap() == 160d)
print(reverse.unwrap())
assert(((2km / 500m) as decimal) == 4d)
print((2km / 500m) as decimal)
let wait = 2h
assert(wait == 7_200_000)
print(wait)
let hours: Hours = 2h
assert(hours.unwrap() == 2d)
print(hours.unwrap())
let nano: Seconds = 1ns
assert(nano.unwrap() == 0.000000001d)
print(nano.unwrap())
assert(1ns == 0)
print(1ns)
let clock = 90_061_000
print("{clock as h}:{clock as min}:{clock as s}:{clock as ms}")
}
main()
Rules and behavior
Validation, schemas and units · Documentation
From a checkout of the repository:
zolo examples/features/dimensional_units.zolo
See also