/**
* A non object-oriented way of coding list operations.
* Each operation is written as a "static" method with one or more lists as
* parameters. These static methods are the equivalent of Scheme functions.
* The list parameters are treated as what is called "abstract data types".
* The instanceof operator is used to check for the type of a given list.
* @author DXN
* @since January 2003
*/
public class ListOps {
/**
* Computes the length of a list by checking what type of a list it is.
* Returns 0 if the list an IEmptyList, otherwise recursively computes
* the length of the rest of the list, adds 1 to the length of the rest,
* and returns the result.
* @param L one of the two types of IList.
* @return an int >= 0
*/
public static int GetLength(IList L) {
if (L instanceof IEmptyList) {
return 0;
}
else {
return 1 + GetLength(((INEList)L).getRest());
// Note how type-casting is used here!
// Why do we need to type-cast?
}
/*
The following is an equivalent code, making use of what is called
the "conditional operator" ?:
Programmers disagree on whether or not such coding is clear.
return
L instanceof IEmptyList ? 0 : 1 + GetLength(((INEList)L).getRest());
*/
}
/**
* Concatenates two lists and returns the result.
* If the first list is empty then simply returns the second list.
* Otherwise recursively concatenate the rest of the first list with the
* the second list, then "cons" the head of the first list to the result.
* @param L1 the first list.
* @param L2 the second list to be concatetnated to L1.
* @return a list consisting of elements in L1 followed by elements in L2.
*/
public static IList Concatenate(IList L1, IList L2) {
if (L1 instanceof IEmptyList) {
return L2;
}
else {
INEList nel = (INEList)L1; // to avoid repeated type-casting
// and messy parentheses.
return new NEList(nel.getFirst(), Concatenate(nel.getRest(), L2));
}
/*
Using the conditional operator ?:
Note the "ugly" syntax of type-casting!
return L1 instanceof IEmptyList ?
L2 :
NEList(((INEList)L1).getFirst(),
Concatenate(((INEList)L1).getRest(), L2));
*/
}
}