// 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) { puts("?"); return 0; } tprint(t); puts(" { "); while (i < tnfields(t)) { let ft = tftype(t, i), v = p[tfoff(t, i)]; if (i) puts(", "); puts(tfname(t, i)); puts(": "); if (tkind(ft) == TY_PTR && telem(ft) == typeof(char)) { putc('"'); puts(v); putc('"'); } else if (tkind(ft) == TY_PTR) { if (v) dump(v); else puts("null"); } else putn(v); i++; } puts(" }"); 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); putc(10); free(d*lamp); return 0; }