// printing any struct with no printing code: the heap knows each object's // type, and reflection walks its fields struct person { char* name; int age; }; struct item { char* name; int count; person* owner; }; fn dump(p) { let t = typeof_obj(p), i = 0; if (!t) { put_s("?"); return 0; } tprint(t); put_s(" { "); while (i < tnfields(t)) { let ft = tftype(t, i), v = p[tfoff(t, i)]; if (i) put_s(", "); put_s(tfname(t, i)); put_s(": "); if (tkind(ft) == TY_PTR && telem(ft) == typeof(char)) { put_c('"'); put_s(v); put_c('"'); } else if (tkind(ft) == TY_PTR) { if (v) dump(v); else put_s("null"); } else put_n(v); i++; } put_s(" }"); return 0; } fn main() { person* ana = new(person); ana.name = "ana"; ana.age = 30; item* lamp = new(item); lamp.name = "lamp"; lamp.count = 3; lamp.owner = ana; dump(lamp); put_c(10); free(d*lamp); return 0; }