On this page:
1 Unions
2 Nested structures
3 Union as food-truck Order
8.6

Lab 5: Unions

Note: Whenever you design or write a function, you need to follow the design recipe.

Recall unions of structures from Lecture 10: Unions of structures.

1 Unions

Exercise 1. Define three examples of railroad Wagons, according to the following data and structure definitions:
; A Wagon is one of:
;  - (make-passenger-wagon Company)
;  - (make-freight-wagon String Number)
 
; A Company is one of:
;  - "Alstom"
;  - "Bombardier"
 
(define-struct passenger-wagon (model))
(define-struct freight-wagon (destination axles))
Your three examples should make use of every line of these data definitions.

Exercise 2. List the names of all the courtesy functions for the passenger-wagon and freight-wagon structures.

Exercise 3. Write the template process-wagon for a function that processes a Wagon, and the template process-company for a function that processes a Company. Here’s a start:
(define (process-wagon w)
  (cond [(passenger-wagon? w)
         (... FILL IN THIS BLANK)]
        [(freight-wagon? w)
         (... FILL IN THIS BLANK)]))
 
(define (process-company c)
  (cond [(FILL IN THIS BLANK)
         ...]
        [(FILL IN THIS BLANK)
         ...]))
Each case of the template process-wagon should access all the fields of the input structure w, using courtesy functions you listed in Exercise 2.

Exercise 4. Point out where the data definition for Wagon refers to the data definition for Company. Does your template process-wagon refer to your template process-company in the corresponding place? It should.

Exercise 5. Design a function wagon-weight, which computes how many tons a Wagon weighs. An Alstom passenger wagon weighs 45 tons, and a Bombardier passenger wagon weighs 60 tons. Each axle of a freight wagon carries 6 tons of weight. Use the examples you defined in Exercise 1 in your tests, and follow the templates you wrote in Exercise 3. Those templates should guide you to design and use a helper function that computes the weight of a given passenger-wagon-model.

Save your lab work for use next week! If you submit it using Handin as assignment lab5, you will be able to retrieve it from anywhere.

2 Nested structures

Now we want to model a train of wagons on a railroad track. A shuttle is a train that that contains up to two wagons. In other words, a shuttle might have no wagons (so it is just an engine), or one wagon (attached to an engine), or two wagons (attached to an engine).

Exercise 6. Develop a data definition and corresponding structure definitions for a Shuttle. Here’s a start:
; A Shuttle is one of:
; - (FILL-IN-THIS-BLANK)
; - (FILL-IN-THIS-BLANK Wagon)
; - (FILL-IN-THIS-BLANK Wagon Wagon)
Don’t use any existing structures other than passenger-wagon and freight-wagon above. Instead, define your own structures.

Exercise 7. Write three examples of Shuttles. Your three examples should make use of every line of your data definition.

Exercise 8. List the names of all the courtesy functions for the structures you defined in Exercise 6.

Exercise 9. Write the template process-shuttle for a function that processes a Shuttle. Here’s a start:
(define (process-shuttle s)
  (cond [(FILL IN THIS BLANK)
         (... FILL IN THIS BLANK)]
        [(FILL IN THIS BLANK)
         (... FILL IN THIS BLANK)]
        [(FILL IN THIS BLANK)
         (... FILL IN THIS BLANK)]))
Like with process-wagon, each case of the template process-shuttle should access all the fields of the input structure s, using courtesy functions you listed in Exercise 8.

Exercise 10. Point out where the data definition for Shuttle refers to the data definition for Wagon. Does your template process-shuttle refer to your template process-wagon in the corresponding places? It should.

Exercise 11. Design the function shuttle-weight, which takes a Shuttle as input and computes how many tons the whole shuttle weighs. The engine weighs 130 tons. Use the examples you defined in Exercise 7 in your tests, and follow the template you wrote in Exercise 9. That template should guide you to define shuttle-weight using the function wagon-weight you designed in Exercise 5.

3 Union as food-truck Order

Do this section in groups of at least 2 people.

Remember your food truck in Lab 2: The design recipe, Lab 3: Multiple cases, and Lab 4: Structures? To offer even more customization, you decided to change the menu again.

Exercise 12. Write a new data definition for an Order that is a union of structures. It should start like this:

; An Order is one of:

; - (make-

; - (make-

(define-struct

(define-struct

To give an Order, a customer must choose one of the listed options, then assign some value to each field of the chosen structure.

Exercise 13. Define at least 3 examples of Orders. Define as many examples as it takes to make use of every line of your data definition.

Exercise 14. List all the courtesy functions for the structures you just defined.

Exercise 15. Write the template for processing an Order.

Exercise 16. Feel free to do this exercise and the next exercise in parallel. However, it is very important that y’all use the same data definition for an Order that y’all just wrote.

Design a function price-order that takes an Order and returns its price (a number).

Exercise 17. Design a function draw-order that takes an Order and returns a crude image of the food.

Exercise 18. Go visit another group and try out their menu:
  1. Read their data definition carefully, but don’t bother reading the rest of their code.

  2. Make an Order. Make sure to obey their data definition for what an Order is.

  3. Give your order to the draw-order function in their Interactions Window. Is it appetizing?

  4. Give the same order to the price-order function in their Interactions Window. Is it worth it?

Exercise 19. (Challenge) Instead of requiring your customers to enter their Orders by following the technical instructions in your data definition, create a big-bang program that allows a customer to edit an Order interactively and graphically. To create such a program, you need to design on-key and/or on-mouse handler functions that switch among the possible kinds of Orders and that adjust the fields of the structure. For instance, you might let the user press a key to switch between ordering a pizza and ordering a burger, and drag the mouse to adjust the size of the pizza or burger.