Files
sx/examples/0619-comptime-metatype-type-info.sx
agra 3805a051cc test(metatype): lock type_info round-trip example (currently bails)
type_info($T) is still unimplemented, so the round-trip
define(declare("ShapeCopy"), type_info(Shape)) bails with
"type_info is not yet implemented" plus the downstream
enum-inference cascade. Snapshot pins that current behavior;
the next commit implements type_info and turns this green.
2026-06-16 22:42:26 +03:00

35 lines
1.1 KiB
Plaintext

// Comptime reflection — `type_info($T)`: reflect a SOURCE enum INTO a `TypeInfo`
// value, then feed that value straight back to `define` to mint a byte-identical
// copy. This is the inverse of `define`'s decode: `type_info` reads a type's
// variants (name + payload type) out of the type table and constructs the same
// `.enum(EnumInfo{ variants })` value the `define` examples write by hand.
//
// Round-trip: `ShapeCopy` is reconstructed purely from `type_info(Shape)` — no
// literal variant list — and constructs/matches like the original.
#import "modules/std.sx";
#import "modules/std/meta.sx";
Shape :: enum {
circle: f64;
rect: i64;
empty;
}
// Reflect Shape → TypeInfo, then reconstruct an identical nominal enum.
ShapeCopy :: define(declare("ShapeCopy"), type_info(Shape));
describe :: (s: ShapeCopy) {
if s == {
case .circle: (r) { print("circle r={}\n", r); }
case .rect: (n) { print("rect n={}\n", n); }
case .empty: { print("empty\n"); }
}
}
main :: () -> i32 {
describe(.circle(2.5));
describe(.rect(7));
describe(.empty);
return 0;
}