// tagged enums: a member can carry fields, a constructor builds it, and a // switch matches on the member and binds its fields enum shape { circle { int r; }, rect { int w; int h; }, dot }; fn area(shape* s) { switch (s) { case circle(r): return r * r * 3; case rect(w, h): return w * h; case dot: return 0; } return -1; } fn main() { shape* a = shape.circle(3); shape* b = shape.rect(4, 5); shape* c = shape.dot(); put_n(area(a)); put_c(32); put_n(area(b)); put_c(32); put_n(area(c)); put_c(32); put_n(a.tag); put_c(32); put_n(b.tag); put_c(32); put_n(c.tag); put_c(10); free(d*a); free(d*b); free(d*c); return 0; }