{Record encode_small_integer prim_arity prim_short_name}

Where

Let (encode_small_integer n)
    (2 * n)

Let (prim_arity name)
    Match (MAP.search prim_arities name)
    | `just.{_ arity} arity
    | `nothing (die (STRING.concat ["No such primitive \"" name "\"."]))
    ;

Let (prim_short_name name)
    Match (MAP.search prim_short_names name)
    | `just.{_ short_name} short_name
    | `nothing (die (STRING.concat ["No such primitive \"" name "\"."]))
    ;

Where

Let prim_arities
    Let (construct_map arity_list)
        (LIST.reduce arity_list MAP.empty MAP.insert)
    In
    (construct_map
        [
            {"die" 1}
            {"file_create" 1}
            {"file_open" 1}
            {"file_close" 1}
            {"file_read_all" 1}
            {"file_write" 2}
            {"string_length" 1}
            {"string_fetch" 2}
            {"string_equal" 2}
            {"string_compare" 2}
            {"string_append" 2}
            {"string_clip" 3}
            {"negate" 1}
            {"multiply" 2}
            {"add" 2}
            {"subtract" 2}
            {"less" 2}
            {"less_or_equal" 2}
            {"greater" 2}
            {"greater_or_equal" 2}
            {"equal" 2}
            {"cons" 2}
            {"print" 1}
            {"print_line" 1}
            {"show_integer" 1}
        ])

Let prim_short_names
    Let (construct_map list)
        (LIST.reduce list MAP.empty MAP.insert)
    In
    (construct_map
        [
            {"die" "s26"}
            {"print" "s18"}
            {"print_line" "s79"}
            {"file_create" "s20"}
            {"file_open" "s23"}
            {"file_close" "s92"}
            {"file_read_all" "s28"}
            {"file_write" "s97"}
            {"show_integer" "s12"}
            {"multiply" "s93"}
            {"add" "s19"}
            {"subtract" "s47"}
            {"negate" "s84"}
            {"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"}
            {"cons" "s34"}
        ])

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"