List
¥abstract class List {
¥  abstract Object getFirst();   
¥  abstract List getRest();
¥  abstract String toStringHelp();
¥}
¥class Empty extends List {
¥  static Empty ONLY = new Empty(); // singleton pattern
¥  private Empty() {}
¥  Object getFirst() { throw new IllegalArgumentException(
¥   "first requires a non Empty List");
¥  }
¥  List getRest() { throw new IllegalArgumentException(
¥   "rest requires a non Empty List");
¥  }
¥  public String toString() { return "()"; }
¥  String toStringHelp() { return ""; }
¥}
¥class Cons extends List {
¥  Object first;
¥  List rest;
¥  Cons(Object f, List r) {
¥    first = f;
¥    rest = r;
¥  }
¥  Object getFirst() { return first; }
¥  List getRest() { return rest; }
¥  public String toString() { return "(" + first + rest.toStringHelp() + ")"; }
¥  String toStringHelp() { return " " + first + rest.toStringHelp(); }
¥}
¥