Section 18.1 Procedures that Call Procedures
Once we start writing procedures, we may want to make use of our new abstractions to build even more complex new procedures. We have already used this idea - our procedures like
square
make use of existing turtle procedures like forward
. But we can also use our own existing procedures to write other new procedures.
Say we want to draw this shape:

We notice that it consists of three rows. Each row consists of three squares. We already know how to write a procedure draw a square… lets use it to write a procedure to draw a row of squares:
The
row
procedure has one parameter - turtleName
. Whatever turtle is specified as the argument in the procedure call to row
will be called turtleName
inside row
. So because we call row(roger)
, turtleName
will mean roger
.
Inside the
row
procedure, we call the square
procedure: square(turtleName, 10)
. Because turtleName
refers to roger
at this point, that is the same as square(roger, 10)
. Because the first parameter of square is turtle
, that means any time we say turtle
in the square procedure, we are going to be working with roger
.
Our
grid
procedure, the parameter is called turtle
. Which is the same name that square
uses for its first parameter. It is OK for two different procedures to use the same name for their parameters. It can however be confusing… just because they have the same name, does not mean that they are always going to have the same value. Just like two people who both make a phone call to “Bob” may be calling the same person, or may not be.
In this case,
roger
is passed to grid
, which calls the turtle turtle
, and passes it to row
, which calls it turtleName
, which passes it to square
which calls it turtle
. Each of the procedures has its own “nickname” for the turtle that they are all working with.
You have attempted 1 of 4 activities on this page.