Students learn how to apply Functions, and how to interpret the information contained in a Contract: Name, Domain and Range. They then use this knowledge to explore more of the Pyret language.
Prerequisites 

Relevant Standards 
Select one or more standards from the menu on the left (⌘click on Mac, Ctrlclick elsewhere). Oklahoma Standards

Lesson Goals 
Students will be able to…

Studentfacing Lesson Goals 

Materials 

Preparation 

Supplemental Resources 

Language Table 
No language features in this lesson 
 arguments

the inputs to a function; expressions for arguments follow the name of a function
 contract

a statement of the name, domain, and range of a function
 domain

the type or set of inputs that a function expects
 function

a mathematical object that consumes inputs and produces an output
 range

the type or set of outputs that a function produces
🔗Applying Functions 15 minutes
Overview
Students learn how to apply functions in Pyret, reinforcing concepts from standard Algebra.
Launch
Students know about Numbers, Strings, Booleans and Operators — all of which behave just like they do in math. But what about functions? They may remember functions from algebra: fx = x².

What is the name of this function?

The expression f2 applies the function f to the number 2. What will it evaluate to?

What will the expression f3 evaluate to?

The values to which we apply a function are called its arguments. How many arguments does f expect?
Arguments (or "inputs") are the values passed into a function. This is different from variables, which are the placeholders that get replaced with input values! Pyret has lots of builtin functions, which we can use to write more interesting programs.
Have students log into CPO and open the "Animals Starter File". If they don’t have the file, they can open a new one. Have students type this line of code into the interactions area and hit Enter: numsqrt(16)
.

What is the name of this function?

What do we think the expression
numsqrt(16)
will evaluate to? 
What did the expression
numsqrt(16)
evaluate to? 
Does the
numsqrt
function produce Numbers? Strings? Booleans? 
How many arguments does
numsqrt
expect?
Have students type this line of code into the interactions area and hit Enter: nummin(140, 84)
.

What is the name of this function?

What does the expression
nummin(140, 84)
evaluate to? 
Does the
nummin
function produce Numbers? Strings? Booleans? 
How many arguments does
nummin
expect? 
What happens if we forget to include a comma between our numbers?
Just like in math, functions can also be composed with one another. For example:
# take the minimum of 84 and 99, then take the square root of the result
numsqrt(nummin(84, 99))
Investigation
Have students complete Applying Functions (Page 48).
Synthesize
Debrief the activity with the class. What kind of value was produced by that expression? (An Image! New datatype!) Which error messages were helpful? Which ones weren’t?
🔗Contracts 35 minutes
Overview
Students learn about Contracts, and how they can be used to figure out new functions or diagnose errors in their code. Then they use this knowledge to explore the contracts pages in their workbooks.
Launch
When students typed triangle(50, "solid", "red")
, they created an example of a new Datatype, called an Image.

What are the types of the arguments
triangle
was expecting? 
How does this output relate to the inputs?

Try making different triangles. Change the size and color! Try using
"outline"
for the second argument.
The triangle
function consumes a Number and two Strings as input, and produces an Image. As you can imagine, there are many other functions for making images, each with a different set of arguments. For each of these functions, we need to keep track of
three things:

Name — the name of the function, which we type in whenever we want to use it

Domain — the type of data we give to the function (names and Types!), written between parentheses and separated by commas

Range — the type of data the function produces
Domain and Range are Types, not specific values. As a convention, we capitalize Types and keep names in lowercase. triangle
works on many different Numbers, not just the 20
we used in the example above!
These three parts make up a contract for each function. Let’s take a look at the Name, Domain, and Range of the functions we’ve seen before:
# numsqrt :: (n :: Number) > Number # nummin :: (a :: Number, b :: Number) > Boolean # triangle :: (side :: Number, mode :: String, color :: String) > Image
The first part of a contract is the function’s name. In this example, our functions are named numsqrt
, and triangle
.
The second part is the Domain, or the names and types of arguments the function expects. triangle
has a Number and two Strings as variables, representing the length of each side, the mode, and the color. We write nametype pairs with doublecolons, with commas between each one. Finally, after the arrow goes the type of the Range, or the function’s output, which in this case is Image.
Contracts tell us a lot about how to use a function. In fact, we can figure out how to use functions we’ve never seen before, just by looking at the contract! Most of the time, error messages occur when we’ve accidentally broken a contract.
Investigate
Turn to the back of your workbook, and get some practice reading and using Contracts! Make sure you try out the following functions:

text

circle

ellipse

star

stringrepeat
When you’ve figured out the code for each of these, write it down in the empty line beneath each contract. These pages will become your reference for the remainder of the class!
Here’s an example of another function. Type it into the Interactions Area to see what it does. Can you figure out the contract, based on the example?
stringcontains("apples, pears, milk", "pears")
Possible Misconceptions
Students are very likely to randomly experiment, rather than actually using the Contracts page. You should plan to ask lots of direct questions to make sure students are making this connection, such as:

How many items are in this function’s Domain?

What is the name of the 1st item in this function’s Domain?

What is the type of the 1st item in this function’s Domain?

What is the type of the Range?
Synthesize
You’ve learned about Numbers, Strings, Booleans, and Images. You’ve learned about operators and functions, and how they can be used to make shapes, strings, and more!
One of the other skills you’ll learn in this class is how to diagnose and fix errors. Some of these errors will be syntax errors: a missing comma, an unclosed string, etc. All the other errors are contract errors. If you see an error and you know the syntax is right, ask yourself these two questions:

What is the function that is generating that error?

What is the contract for that function?

Is the function getting what it needs, according to its Domain?
By learning to use values, operations and functions, you are now familiar with the fundamental concepts needed to write simple programs. You will have many opportunities to use these concepts in this course, by writing programs to answer data science questions.
Make sure to save your work, so you can go back to it later!
🔗Additional Exercises:
These materials were developed partly through support of the National Science Foundation, (awards 1042210, 1535276, 1648684, and 1738598). Bootstrap:Integrated Oklahoma by Jen Poole is licensed under a Creative Commons 4.0 Unported License. Based on a work at www.BootstrapWorld.org. Permissions beyond the scope of this license may be available by contacting schanzer@BootstrapWorld.org.