test(metatype): comptime subslice over an aggregate (examples/0621)

make_enum from dirs[0..2] — mints Axis from a comptime SUBSLICE of a
local EnumVariant array. Locks the interp subslice-over-non-string-
aggregate fix (d22037c); previously bailed.
This commit is contained in:
agra
2026-06-17 05:15:43 +03:00
parent d22037c4a7
commit 60471b3a2c
4 changed files with 34 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
// Comptime slice over a non-string AGGREGATE: assemble a pool of candidate
// variants in a local array, then mint an enum from a SUBSLICE of it. This
// exercises the interp's `subslice` op on an array VALUE (`dirs[0..2]`) — which
// used to bail ("slice over non-string aggregates not yet supported") — now
// yielding a real `[]EnumVariant` the `define` decoder reads.
//
// `Axis` is built from only the first two of four directions, so `.south` /
// `.west` are NOT variants of it.
#import "modules/std.sx";
#import "modules/std/meta.sx";
build_axis :: () -> Type {
dirs := EnumVariant.[
EnumVariant.{ name = "north", payload = void },
EnumVariant.{ name = "east", payload = i64 }, // carries a bearing
EnumVariant.{ name = "south", payload = void },
EnumVariant.{ name = "west", payload = void },
];
return make_enum("Axis", dirs[0..2]); // first two only — a comptime subslice
}
Axis :: build_axis();
main :: () -> i32 {
a : Axis = .north;
b : Axis = .east(90);
if a == { case .north: { print("north\n"); } case .east: (d) { print("east {}\n", d); } }
if b == { case .north: { print("north\n"); } case .east: (d) { print("east {}\n", d); } }
return 0;
}

View File

@@ -0,0 +1 @@
0

View File

@@ -0,0 +1,2 @@
north
east 90