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.
35 lines
1.1 KiB
Plaintext
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;
|
|
}
|