master
 1const std = @import("std");
 2const expectEqual = std.testing.expectEqual;
 3
 4const Instruction = enum {
 5    add,
 6    mul,
 7    end,
 8};
 9
10fn evaluate(initial_stack: []const i32, code: []const Instruction) !i32 {
11    var buffer: [8]i32 = undefined;
12    var stack = std.ArrayList(i32).initBuffer(&buffer);
13    try stack.appendSliceBounded(initial_stack);
14    var ip: usize = 0;
15
16    return vm: switch (code[ip]) {
17        // Because all code after `continue` is unreachable, this branch does
18        // not provide a result.
19        .add => {
20            try stack.appendBounded(stack.pop().? + stack.pop().?);
21
22            ip += 1;
23            continue :vm code[ip];
24        },
25        .mul => {
26            try stack.appendBounded(stack.pop().? * stack.pop().?);
27
28            ip += 1;
29            continue :vm code[ip];
30        },
31        .end => stack.pop().?,
32    };
33}
34
35test "evaluate" {
36    const result = try evaluate(&.{ 7, 2, -3 }, &.{ .mul, .add, .end });
37    try expectEqual(1, result);
38}
39
40// test