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.
31 lines
1.2 KiB
Plaintext
31 lines
1.2 KiB
Plaintext
// 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;
|
|
}
|