Rat docs

Math

Nine numeric builtins. Three rounding modes (floor, ceil, round) plus a decimal-aware round_to, the obvious abs, variadic min / max, a bounding clamp, and lerp for animations or progress mapping. Operator arithmetic (+, -, *, /, %) lives in the grammar — these builtins are the named operations on top.

floor — round toward negative infinity

3.7 → 3, -3.2 → -4

Strips the fractional component, always rounding down on the number line. floor(-3.2) == -4 — the direction is "toward negative infinity", not "toward zero".

<p> [floor(3.7)]
<p> [floor(0 - 3.2)]
Result

floor(3.7) = 3

floor(-3.2) = -4

ceil — round toward positive infinity

3.2 → 4, -3.7 → -3

Mirror image of floor: always rounds up on the number line. ceil(-3.7) == -3.

<p> [ceil(3.2)]
<p> [ceil(0 - 3.7)]
Result

ceil(3.2) = 4

ceil(-3.7) = -3

round — half away from zero

3.5 → 4, -3.5 → -4

round(x) uses "half away from zero" tie-breaking, matching the schoolbook convention. For decimal precision, see round_to.

<p> [round(3.5)]
<p> [round(3.4)]
Result

round(3.5) = 4

round(3.4) = 3

round_to — N decimal places

Negative places round to powers of ten

round_to(x, places) rounds to a decimal precision. Positive places trims fractional digits (round_to(3.14159, 2) == 3.14); negative places rounds to tens, hundreds, etc. (round_to(1234, -2) == 1200).

<p> [round_to(3.14159, 2)]
<p> [round_to(1234, 0 - 2)]
Result

round_to(3.14159, 2) = 3.14

round_to(1234, -2) = 1200

abs — absolute value

Drops the sign

abs(x) returns x with no sign. Use the 0 - n spelling for negative literals — -7 sometimes parses as a subtraction context in attribute syntax.

<p> [abs(0 - 7)]
<p> [abs(42)]
Result

abs(-7) = 7

abs(42) = 42

min / max — variadic

Any number of args; mixed int + float is fine

min(...) and max(...) accept any number of comparable args and return the extreme. Use them for guard rails, axis bounds in charts, or for spreading arrays via min(...arr) equivalents (write a helper using reduce if you need that today).

<p> [min(5, 2, 8, 1, 9)]
<p> [max(5, 2, 8, 1, 9)]
Result

min = 1

max = 9

clamp — bound to a range

clamp(x, lo, hi)

clamp(x, lo, hi) returns lo if x < lo, hi if x > hi, else x. Ubiquitous for keeping UI values inside their valid range — scroll positions, slider values, animation progress.

<button on_click[p_count++]> +1
<p> [p_count] clamped to 0..5 = [clamp(p_count, 0, 5)]
Result

3 clamped to 0..5 = 3

lerp — linear interpolation

lerp(a, b, t) — t between 0 and 1

lerp(a, b, t) returns a + (b - a) * t. With t = 0 you get a; with t = 1 you get b. Use it for animated transitions, easing-curve endpoints, or mapping a progress fraction onto a display range.

<p> [lerp(0, 100, 0.25)]
<p> [lerp(0, 100, 0.5)]
<p> [lerp(0, 100, 0.75)]
Result

t=0.25: 25

t=0.5: 50

t=0.75: 75

Next: Conversion — str, num, bool for coercing between kinds.