The VM
vm-locals

Local variables for the VM. Same pattern as the interpreter -- parallel arrays for names and values.

var vm_local_names: [64][]const u8 = undefined;
var vm_local_values: [64]i64 = [_]i64{0} ** 64;
var vm_local_count: usize = 0;

fn vm_get_local(name: []const u8) i64 {
    for (0..vm_local_count) |i| {
        if (streq(vm_local_names[i], name)) {
            return vm_local_values[i];
        }
    }
    return 0;
}

fn vm_set_local(name: []const u8, val: i64) void {
    for (0..vm_local_count) |i| {
        if (streq(vm_local_names[i], name)) {
            vm_local_values[i] = val;
            return;
        }
    }
    vm_local_names[vm_local_count] = name;
    vm_local_values[vm_local_count] = val;
    vm_local_count += 1;
}

We reuse our streq from Problem 16. No standard library, remember?