//package straightparse; abstract class List { public abstract A accept (ListVisitor v); } class NIL extends List { public NIL () { } public A accept (ListVisitor v) { return v.visit (this); } } class CONS extends List { public a hd; public List tl; public CONS (a x, List xs) { this.hd = x; this.tl = xs; } public A accept (ListVisitor v) { return v.visit (this); } } interface ListVisitor { public A visit (NIL m); public A visit (CONS m); }