5.9 The inventory
Imagine that you’re trying to bake cookies. A smart cook will get all the ingredients (eggs, milk, butter, sugar, chocolate chips, etc.) out and put them on the counter before mixing anything together: that way you can see whether you have enough of everything. We’ll do something similar: list everything that’s available for you to use in defining the function, before starting to put things together. At this stage, that basically means the parameters (it will get more interesting later).
You should also recall from Chapter 4 that the parameter names that appear in the function header must exactly match those that appear in the function body — same spelling, same capitalization, etc. You may have no idea how the function body is going to work, but you can be pretty sure that the parameter names you put in the header will be used in it.
At this stage, I recommend writing the names of all the parameters, one on each line, commented out, in between the function header and the “...” where its body will eventually be. It’s often helpful to also write down, next to each parameter, what data type it is; this determines what you can reasonably do with it.
There may also be particular pieces of information that are always the same, regardless of the arguments passed into the function. For example, a function that is supposed to always draw in blue will presumably use the word "blue" at least once in its body. I generally ask students to write a skeleton, as above, and then insert the inventory information before the “...”.
Worked Exercise 5.9.1 Add an inventory to the skeleton for the counterchange function of Exercise 5.5.1.
Solution: We’ve already written the skeleton:
(define (counterchange top-left top-right)
...)
We don’t know yet how the function body will work, but we’re pretty sure it will involve the variable names top-left and top-right. So we list these, one on each line, commented out, along with their types. The complete function skeleton, with inventory then reads
(define (counterchange top-left top-right)
; top-left image
; top-right image
...)
Together with the contract and examples we wrote before, the Definitions pane should now look like Figure 5.1.
SIDEBAR:
Later in the book, we’ll talk about something analogous called an “outventory”. Where an inventory answers the question “what am I given, and what can I do with it?”, an outventory answers the question “what do I need to produce, and how can I produce it?”. If the inventory is like collecting the raw ingredients for cookies, the outventory is like observing that the last step in the recipe is baking, and concluding that you’d better preheat the oven and make sure you have a cookie sheet.
We’ll come back to this concept when we have problems to solve that need it. For now, inventories will do just fine.
Exercise 5.9.2 Add an inventory to the skeleton for the copies-beside function of Exercise 5.8.1.
Exercise 5.9.3 Add an inventory to the pinwheel function of Exercise 5.8.2.
Exercise 5.9.4 Add an inventory to the checkerboard2 function of Exercise 5.8.3.
Hint: In addition to the parameters, this function will almost certainly need to use the number 20 (the size of each small square), so you can include another line with 20 on it. Its type, obviously, is number.
Exercise 5.9.5 Add an inventory to the bullseye function of Exercise 5.8.4.
Hint: This function will need to make some solid circles, so it’ll need the string "solid". Include this fixed value, on a line by itself, along with the parameters.
Worked Exercise 5.9.6 Add an inventory to the dot-grid function of Exercise 5.8.5.
Solution: You should already have a skeleton, so we’ll discuss only what to add to it. Suppose your parameter names are width and height. Obviously, you’ll need them inside the body:
; width a number
; height a number
In addition, you know that the function will need radius-5 circular blue dots . To produce these, we can be fairly certain that we’ll need the expression (circle 5 "solid" "blue"). This too can be added to the inventory. The skeleton with inventory now looks like
(define (dot-grid width height)
; width a number
; height a number
; (circle 5 "solid" "blue") an image
...)
Exercise 5.9.7 Add an inventory to the lollipop function of Exercise 5.8.6.