Quantities and Units

As a super-class of numbers, Kawa also provides quantities. A quantity is a product of a unit and a pure number. The number part can be an arbitrary complex number. The unit is a product of integer powers of base units, such as meter or second.

Quantity literals have the following syntax:

quantity ::= optional-sign decimal unit-term [* unit-term]... [/ unit-term]
unit-term ::= unit-name [^ digit+]
unit-name ::= letter+

Some examples are 10pt (10 points), 5s (5 seconds), and 4cm^2 (4 square centimeters).

Note the quantity syntax is not recognized by the reader. Instead these are read as symbols. Assuming there is no lexical binding the for the symbol, it will be rewritten at compile-time into an expression. For example 4cm^2 is transformed into:

(* 4.0 (expt unit:cm 2))

Procedure: quantity? object

True iff object is a quantity. Note that all numbers are quantities, but not the other way round. Currently, there are no quantities that are not numbers. To distinguish a plain unit-less number from a quantity, you can use complex?.

Procedure: quantity->number q

Returns the pure number part of the quantity q, relative to primitive (base) units. If q is a number, returns q. If q is a unit, yields the magitude of q relative to base units.

Procedure: quantity->unit q

Returns the unit of the quantity q. If q is a number, returns the empty unit.

Procedure: make-quantity x unit

Returns the product of x (a pure number) and unit. You can specify a string instead of unit, such as "cm" or "s" (seconds).

Syntax: define-base-unit unit-name dimension

Define unit-name as a base (primitive) unit, which is used to measure along the specified dimension.

(define-base-unit dollar "Money")

Syntax: define-unit unit-name expression

Define unit-name as a unit (that can be used in literals) equal to the quantity expression.

(define-unit cent 0.01dollar)

The unit-name is declared in the unit namespace, so the above is equivalent to:

(define-constant unit:cent (* 0.01 unit:dollar))


The following angle units are dimensionless, with no base unit.

Some procedures treat a unit-less real number as if it were in radians (which mathematicians prefer); some procedures (such as rotate) treat a unit-less real number as if it were in degrees (which is common in Web and other standards).

Unit: rad

A unit for angles specified in radians. A full circle is 2*pi radians. Note that (= 1.5 1.5rad) is true, while (eqv? 1.5 1.5rad) is false.

Unit: deg

A unit for angles specified in degrees. A full circle is 360 degrees.

Unit: grad

A unit for angles specified in gradians. A full circle is 400 gradians.