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