{
: encode_small_integer
: prim_arity
: prim_short_name
}

Where

Define (encode_small_integer n)
    [2 * n]

Define (prim_arity name)
    Match (MAP.search prim_arities name)
    | 'just.{_ arity} arity
    | 'nothing
        (die (STRING.concat [Right "No such primitive \"" & name & "\"." & 'nil]))
    ;

Define (prim_short_name name)
    Match (MAP.search prim_short_names name)
    | 'just.{_ short_name} short_name
    | 'nothing
        (die (STRING.concat [Right "No such primitive \"" & name & "\"." & 'nil]))
    ;

Where

Let prim_arities
    Define (construct_map arity_list)
        (LIST.reduce arity_list MAP.empty MAP.insert)
    In
    (construct_map
        [Right
            {"die" 1} &
            {"command_argc" 1} &
            {"command_argv" 1} &
            {"file_create" 1} &
            {"file_open" 1} &
            {"file_close" 1} &
            {"file_read_all" 1} &
            {"file_write" 2} &
            {"file_write_byte" 2} &
            {"string_length" 1} &
            {"string_fetch" 2} &
            {"string_equal" 2} &
            {"string_compare" 2} &
            {"string_append" 2} &
            {"string_clip" 3} &
            {"scratchpad_new" 1} &
            {"scratchpad_size" 1} &
            {"scratchpad_store_uint8" 3} &
            {"scratchpad_fetch_uint8" 2} &
            {"scratchpad_store_int8" 3} &
            {"scratchpad_fetch_int8" 2} &
            {"scratchpad_store_uint16_le" 3} &
            {"scratchpad_fetch_uint16_le" 2} &
            {"scratchpad_store_int16_le" 3} &
            {"scratchpad_fetch_int16_le" 2} &
            {"scratchpad_store_uint32_le" 3} &
            {"scratchpad_fetch_uint32_le" 2} &
            {"scratchpad_store_int32_le" 3} &
            {"scratchpad_fetch_int32_le" 2} &
            {"scratchpad_store_uint64_le" 3} &
            {"scratchpad_fetch_uint64_le" 2} &
            {"scratchpad_store_int64_le" 3} &
            {"scratchpad_fetch_int64_le" 2} &
            {"negate" 1} &
            {"quotient" 2} &
            {"remainder" 2} &
            {"multiply" 2} &
            {"add" 2} &
            {"subtract" 2} &
            {"less" 2} &
            {"less_or_equal" 2} &
            {"greater" 2} &
            {"greater_or_equal" 2} &
            {"equal" 2} &
            {"print" 1} &
            {"print_line" 1} &
            {"show_integer" 1} &
            'nil])

Let prim_short_names
    Define (construct_map list)
        (LIST.reduce list MAP.empty MAP.insert)
    In
    (construct_map
        [Right
            {"die" "s26"} &
            {"command_argc" "s40"} &
            {"command_argv" "s24"} &
            {"print" "s18"} &
            {"print_line" "s79"} &
            {"file_create" "s20"} &
            {"file_open" "s23"} &
            {"file_close" "s92"} &
            {"file_read_all" "s28"} &
            {"file_write" "s97"} &
            {"file_write_byte" "s77"} &
            {"show_integer" "s12"} &
            {"multiply" "s93"} &
            {"add" "s19"} &
            {"subtract" "s47"} &
            {"negate" "s84"} &
            {"quotient" "s91"} &
            {"remainder" "s43"} &
            {"equal" "s50"} &
            {"less" "s10"} &
            {"less_or_equal" "s63"} &
            {"greater" "s61"} &
            {"greater_or_equal" "s55"} &
            {"string_length" "s65"} &
            {"string_fetch" "s69"} &
            {"string_compare" "s37"} &
            {"string_equal" "s45"} &
            {"string_append" "s25"} &
            {"string_clip" "s44"} &
            {"scratchpad_new" "s38"} &
            {"scratchpad_size" "s14"} &
            {"scratchpad_store_uint8" "s42"} &
            {"scratchpad_fetch_uint8" "s13"} &
            {"scratchpad_store_int8" "s76"} &
            {"scratchpad_fetch_int8" "s46"} &
            {"scratchpad_store_uint16_le" "s54"} &
            {"scratchpad_fetch_uint16_le" "s29"} &
            {"scratchpad_store_int16_le" "s08"} &
            {"scratchpad_fetch_int16_le" "s98"} &
            {"scratchpad_store_uint32_le" "s74"} &
            {"scratchpad_fetch_uint32_le" "s01"} &
            {"scratchpad_store_int32_le" "s17"} &
            {"scratchpad_fetch_int32_le" "s59"} &
            {"scratchpad_store_uint64_le" "s21"} &
            {"scratchpad_fetch_uint64_le" "s99"} &
            {"scratchpad_store_int64_le" "s58"} &
            {"scratchpad_fetch_int64_le" "s80"} &
            'nil])

Where

Let MAP
    (SEARCH.MAP STRING.compare
        Func {{key _}} key)

Let die OS.die

Where

Let LIST Package "list"
Let OS Package "os"
Let SEARCH Package "search"
Let STRING Package "string"