8.10

Lab 6: Recursive unions

Last time in Lab 5: Unions, you designed a function wagon-weight that computes the weight of a given wagon. This design required the data definition of a Wagon and its corresponding template process-wagon. Now we want to model a train that might be made of any number of wagons.

Exercise 1. A train might have no wagons (so it is just an engine), or it might contain a single wagon connected to the rest of the train. Develop a data definition and corresponding structure definitions for a TrainOfWagons. Here’s a start:
; A TrainOfWagons is one of:
; - (FILL-IN-THIS-BLANK)
; - (FILL-IN-THIS-BLANK Wagon TrainOfWagons)
Don’t use any existing structures. Instead, define your own structures.

Exercise 2. Write three examples of TrainsOfWagons. Your three examples should make use of every line of your data definition. Hint: Use the example Wagons you defined last time.

Exercise 3. List the names of all the courtesy functions for the structures you defined in Exercise 1.

Exercise 4. Write the template process-train-of-wagons for a function that processes a TrainOfWagons. Here’s a start:
(define (process-train-of-wagons t)
  (cond [(FILL IN THIS BLANK)
         (... FILL IN THIS BLANK)]
        [(FILL IN THIS BLANK)
         (... FILL IN THIS BLANK)]))
Like with process-wagon last time, each case of the template process-train-of-wagons should access all the fields of the input structure t, using courtesy functions you listed in Exercise 3.

Exercise 5. Point out where the data definition for TrainOfWagons refers to the data definition for Wagon. Does your template process-train-of-wagons refer to your template process-wagon last time in the corresponding place? It should.

Exercise 6. Point out where the data definition for TrainOfWagons refers to itself. Does your template process-train-of-wagons refer to itself in the corresponding place? It should.

Exercise 7. Design the function train-length, which takes a TrainOfWagons as input and counts how many wagons it has. Use the examples you defined in Exercise 2 in your tests, and follow the template you wrote in Exercise 4.

Exercise 8. Design the function train-weight, which takes a TrainOfWagons as input and computes how many tons the whole train weighs. As you might remember from last time, the engine weighs 130 tons. Again, use the examples you defined in Exercise 2 in your tests, and follow the template you wrote in Exercise 4. That template should guide you to define train-weight using the function wagon-weight you designed last time and the function train-weight itself.

Exercise 9. Design the function has-passenger?, which takes a TrainOfWagons as input and determines whether it contains any passenger wagon.

Exercise 10. Design the function freight-only, which takes a TrainOfWagons as input and produces a possibly shorter TrainOfWagons by keeping only freight wagons. Again, use the examples you defined in Exercise 2 in your tests, and follow the template you wrote in Exercise 4.