{
:Prefix -
:Infix <
:Infix <=
:Infix >
:Infix >=
:Infix =
:Infix !=
:Infix +
:Infix -
:Infix *
:Infix /
:Infix %
:read
:show
:compare
:min
:max
:pow
:gcd
:abs
:fold
}

Where

Define (pow b n)
    Iterate {a b n} From {1 b n}
        Let a If [[n % 2] = 1] [a * b] a
        Let n [n / 2]
        In
        If [n = 0]
            a
            (Continue a [b * b] n)

Define (gcd b a)
    Iterate {b a}
        If [a = 0]
            (abs b)
            (Continue a [b % a])

Define (fold n z succ)
    Iterate {i r} From {0 z}
        If [i = n]
            r
            (Continue [i + 1] (succ i r))

Where

Define (read text)
    Let n (Prim chunk_size text)
    In
    Iterate {i num} From {0 0}
        Cond {
        | [i = n] 'just.num
        | True
            Let c (Prim chunk_fetch_uint8 text i)
            In
            If (And [c >= `0`] [c <= `9`])
                (Continue [i + 1] [[10 * num] + [c - `0`]])
                'nothing
        }

Define (show i)
    (Prim show_integer i)

Where

Define (compare a b)
    Cond {
    | [a < b] 'less
    | [a > b] 'greater
    | True 'equal
    }

Define (min a b)
    If [a < b] a b

Define (max a b)
    If [a > b] a b

Define (abs n)
    If [n < 0] -n n

Where

Define -a (Prim negate a)

Define [a < b] (Prim less a b)
Define [a <= b] (Prim less_or_equal a b)
Define [a > b] (Prim greater a b)
Define [a >= b] (Prim greater_or_equal a b)
Define [a = b] (Prim equal a b)
Define [a != b] If (Prim equal a b) False True

Define [[a] + b] (Prim add a b)
Define [[a] - b] (Prim subtract a b)
Define [[a] * b] (Prim multiply a b)
Define [a / b] (Prim quotient a b)
Define [a % b] (Prim remainder a b)