// Comptime compiler API — read-only reflection readers (Phase 3). // // `find_type` / `type_field_count` are bound to the `compiler` library via // `abi(.compiler)`, joining the `intern` / `text_of` seed. They are // the first REFLECTION readers: the compiler exposes its own type table to // comptime sx as plain handles (a `TypeId` is a u32, like a `StringId`), so the // calls are clean scalar host-calls — handle in, scalar out, no marshaling. // // find_type(name) → the named type's handle (0 / `unresolved` if absent) // type_field_count(t) → its member count (struct fields here) // // Comptime-only: they run inside `#run`, folding to plain int constants the // runtime `main` prints. Chains `intern` → `find_type` → `type_field_count`. #import "modules/std.sx"; StringId :: u32; TypeId :: u32; intern :: (s: string) -> StringId abi(.compiler); find_type :: (name: StringId) -> TypeId abi(.compiler); type_field_count :: (t: TypeId) -> i64 abi(.compiler); Point :: struct { x: i64; y: i64; z: i64; } // Look the struct up by name and count its fields, all at comptime. point_fields :: #run type_field_count(find_type(intern("Point"))); // A name with no matching type folds to the `unresolved` sentinel (0). missing_id :: #run find_type(intern("NoSuchType")); main :: () { print("Point has {} fields\n", point_fields); print("missing type id = {}\n", missing_id); }