// 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; }