Consider the following variation on homework problems 2.2, 3.3, and 7.2: A Enumeration is either an OpenDotList or a ClosedDotList An OpenDotList is a list of strings A ClosedDotList is also a list of strings. Enumerations support the following operations: render() -- as in homework problem 7.2, except that it does not take a style argument: the style is determined by whether the Enumeration is an OpenDotList or a ClosedDotList . Returns a list of strings, as in 7.2 get(int n) -- returns the n-th item in the enumeration (counting from 1). If there is no n-th item (either because n is greater than the length of the enumeration or because n is <= 0), returns the empty string. remove(int n) -- returns an enumeration like the original, except that the n-th item has been removed. If there is no n-th item, returns an enumeration just like the original. swap(int n, int m) -- returns an enumeration like the original, except that the n-th and m-th items are swapped. If there is no n-th or m-th item, returns an enumeration just like the original. ---------------------------- I think I would include a set of data definitions in Scheme along with examples. I'm also considering making the problem harder by switching to the following: A Enumeration is either an OpenDotList or a ClosedDotList An OpenDotList is a list of Items A ClosedDotList is also a list of Items An Item is either a String or an Enumeration ------------------------------------ This would seem to offer a bunch of opportunities for abstraction. What do you think?