Functional Problem Solving (CSC 151 2013F) : Labs
Primary: [Front Door] [Schedule] - [Academic Honesty] [Disabilities] [Email] [FAQ] [IRC] [Teaching & Learning] [Grading]
Current: [Assignment] [EBoard] [Lab] [Outline] [Partners] [Reading]
Sections: [Assignments] [EBoards] [Examples] [Handouts] [Labs] [Outlines] [Partners] [Readings]
Reference: [Setup] - [Functions A-Z] [Functions By Topic] - [Racket] [Scheme Report (R5RS)] [R6RS] [TSPL4]
Related Courses: [Davis (2013F)] [Rebelsky (2010F)] [Weinman (2012F)]
Misc: [SamR] [Glimmer Labs] [CS@Grinnell] [Grinnell] [Issue Tracker (Course)]
Summary: In this laboratory, you will begin to type Scheme/Racket expressions, using DrRacket. Scheme is the language in which we will express many of our algorithms this semester. Racket is a particular implementation of Scheme (which varies a bit from the Scheme standard). DrRacket is the environment in which we will write those programs.
Many of the fundamental ideas of computer science are best learned by reading, writing, and executing small computer programs that illustrate them. One of our most important tools for this course, therefore, is a program-development environment, a computer program designed specifically to make it easier to read, write, and execute other computer programs. In this class, we will often use a program development environment named DrRacket; Racket, a dialect of a language called Scheme; and an open-source graphics program called GIMP, to build images algorithmically.
In this lab, we look at the language side of the environment: the Scheme language and the DrRacket program development environment. In a subsequent lab, we will examine GIMP.
Open a terminal window and type the following incantation (without the dollar sign prompt, and substituting in your own user name).
$raco link /home/username/Desktop
Click Enter. You will know the incantation worked when a new command prompt appears. Close the terminal window.
If you successfully completed the Linux laboratory, you should have an icon for DrRacket at the bottom of your screen. Click on that icon to start DrRacket.
You will also need to configure DrRacket to behave properly. (If all goes well, you will only need to do this once.)
In the menu, select . A dialog box will appear. Click the radio button next to “Use the language declared in the source”. Then click . The dialog should disappear.
Click the to make sure the changes take effect. You should see “Language: racket” in the bottom pane.
(sqrt 144)(+ 3 4)(+ 3 (* 4 5))(* (+ 3 4) 5)(string-append "Hello" " " "Professor Rebelsky")As you may remember from the reading on DrRacket, the DrRacket window has two panes, one for definitions and one for interactions. Just as in the reading, we'll begin by considering the interactions panel.
The best way to understand the interactions pane is to use it. So, let's try the first few examples from the reading. Type each in the pane, hit return, and see if you get the same value.
>(sqrt 144)12>(+ 3 4)7>(+ 3 (* 4 5))23>(* (+ 3 4) 5)35>(string-append "Hello" " " "Professor Rebelsky")"Hello Professor Rebelsky"
(sqrt 137641).
Of course, the computer is using some algorithm to compute values for the expressions you enter. How do you know that the algorithm is correct? One reason that you might expect it to be correct is that Scheme is a widely-used programming language (and one that we've asked you to use). However, there are bugs even in widely-used programs. You may recall a controversy a few years back in which it was discovered that a common computer chip computed a few specific values incorrectly, and no one had noticed. More recently, it was found that the output routine in Microsoft Excel produced the wrong output for a few values. And you may have some evidence that your faculty like to trick you. Hence, you might be a bit suspicious.
Each time you do a computation, particularly a computation for which you have designed the algorithm, you should consider how you might verify the result. (You need not verify every result, but you should have an idea of how you might do so.) When writing an algorithm, you can then also use the verification process to see if your algorithm is right.
Let's start with a relatively simple example. Suppose we ask you to ask DrRacket to compute the square root of 137641. You should be able to do so by entering an appropriate Scheme expression:
>(sqrt 137641)
DrRacket will give you an answer. How can you test the correctness of this answer? What if you don't trust DrRacket's multiplication procedure? (Be prepared to answer this question for the class as a whole.)
As you may recall from the reading, the upper text area in the DrRacket window, which is called the definitions pane, is used when you want to prepare a program “off-line”, that is, without immediately executing each step. Instead of processing what you type line by line, DrRacket waits for you to click on the button labelled (the second button from the right, in the row just below the menu bar) before starting to execute the program in the definitions pane. If you never click on that button, fine -- your program is never executed.
Let's try using the definitions pane. First, enter the following in that pane.
#lang racket (define times-rating 5) (define tribune-rating 4.5) (define cbs-rating 3.5) (define nbc-rating 4) (define abc-rating 5) (define fox-rating 3)
Next, try computing the average in the interactions pane.
>(/ (+ times-rating tribune-rating cbs-rating nbc-rating abc-rating fox-rating) 6)reference to undefined identifier: times-rating Interactions:1:0: times-rating
It is likely that you will get an error message, just as the example suggests. Why? (Please make sure you have an answer before going on.)
Next, click and try entering the expression again. (Remember, the Ctrl-UpArrow will bring back the previous expression.)
Note: we've formatted the code for the definitions pane differently than we've formatted the code for the interactions pane. We'll try to be consistent, so that you can better tell where instructions are to go.
Let's try another definition. Define name as your name in
quotation marks. For example,
(define name "Professor Rebelsky")
Click and then find the value of the following expression.
>(string-append "Hello " name)
Let's make sure that you can save and restore the work you do in the definitions pane.
/home/username/Desktop/ratings.rkt. (Substitute your own username for username.)
/home/username/Desktop/ratings.rkt.
(/ (+ times-rating tribune-rat9ing cbs-rating nbc-rating abc-rating fox-rating) 6)(string-append "Hello " name)Let's try using the definitions you created without having them open in the definitions pane.
sandb-rating, to ratings.rkt .
#lang racket. This
line tells Racket that other programs can access your definitions.
(provide (all-defined-out))
ratings.rkt, but do not run it.
sandb-rating.
You should get an error message, which tells you that
sandb-rating is not yet defined.
>(require Desktop/ratings)
sandb-rating. You should now
see a value.
In the future, we will be creating some .rkt files that
contain definitions that we change infrequently. Those files we will
require, rather than open.
Throughout the semester, you will find yourself defining a number
of values (including algorithms, which Scheme considers values).
So that you don't have to go back to lots of places to look for
things you've done before, we suggest that you create a file,
library.rkt in which you enter values and other
stuff that you'll need again and again.
Open a new window or tab and define two values, first-name,
which should have the value of your first name, and
last-name, which, should have the value of your last name.
For example,
#lang racket (provide (all-defined-out)) (define first-name "Samuel") (define last-name "Rebelsky")
Save that file as /home/username/Desktop/library.rkt. (Do not include the final period.)
As you've learned, Scheme expects you to use parentheses and prefix notation when writing expressions. What happens if you use more traditional mathematical notation? Let's explore that question.
Type each of the following expressions at the Scheme prompt and see what reaction you get.
(2 + 3)7 * 9sqrt(49)You may wish to read the notes on this problem for an explanation of the results that you get.
As you observed in the primary exercises for this laboratory, you can use the definitions pane to name values that you expect to use again (or that you simply find it more convenient to refer to with a mnemonic). So far, all we've named is simple values. However, you can also name the results of expressions.
a. In the definitions pane, write a definition that assigns the name
seconds-per-minute to the value 60.
b. In the definitions pane, write a definition that assigns the name
minutes-per-hour to the value 60.
c. In the definitions pane, write a definition that assigns the name
hours-per-day to the value 24.
d. In the definitions pane, write a definition that assigns the name
seconds-per-day to the product of those three values. Note
that you should use the following expression to express that product.
(* seconds-per-minute minutes-per-hour hours-per-day)
e. Run your definitions and confirm in the interactions pane that
seconds-per-day is defined correctly.
f. Add these four definitions to the library.rkt file
you created earlier.
Let's play for a bit with how one might use DrScheme to compute grades.
(We teach you this, in part, so that you can figure out your estimated
grade in this class and others.) Let's define five names, grade1
through grade5 that potentially represent grades on five
homework assignments.
(define grade1 95) (define grade2 93) (define grade3 105) (define grade4 30) (define grade5 80)
Looking at those grades, you might observe that the student seems to have spent a bit of extra work on the third assignment, but that the extra work so disrupted the student's life that the next assignment was a disaster. (You may certainly analyze the grades differently.)
a. Write a definition that assigns the name average-grade to
the average of the grades.
Many faculty members discard these “outliers”, with a grading policy of “I take the average of your grades after dropping the highest grade and the lowest grade”.
b. Write a definition that assigns the name highest-grade
to a computed highest grade. (That is,
highest-grade should remain correct, even if I change the
values associated with grade1 through grade5.)
In writing this definition, you may find the max
procedure useful.
c. Write a definition that assigns the name lowest-grade
to a computed lowest grade. You may find the
min procedure useful.
d. Write a definition that assigns the name
modified-average to the modified average grade (that is,
the grade that results from dropping the lowest and highest grades
and then averaging the result).
>(2 + 3)procedure application: expected procedure, given: 2; arguments were: #<procedure:+> 3 Interactions:1:0: ((quote 2) + (quote 3))
When the Scheme interpreter sees the left parenthesis at the beginning
of the expression (2 + 3), it expects the expression to
be a procedure call, and it expects the procedure to be identified
right after the left parenthesis. But 2 does not
identify a procedure; it stands for a number. (A “procedure
application” is the same thing as a procedure call.)
>7 * 97#<procedure:*>9
In the absence of parentheses, the Scheme interpreter sees 7 *
9 as three separate and unrelated expressions -- the numeral
7; *, a name for the primitive multiplication
procedure; and 9, another numeral. It interprets each of
these as a command to evaluate an expression: “Compute the value
of the numeral 7! Find out what the name *
stands for! Compute the value of the numeral 9!”
So it performs the first of these commands and displays 7;
then it carries out the second command, reporting that *
is the name of the primitive procedure *; and finally it
carries out the third command and displays the result, 9.
This behavior is confusing, but it's strictly logical if you look at
it from the computer's point of view (remembering, of course, that
the computer has absolutely no common sense).
>sqrt(49)#<procedure:sqrt>procedure application: expected procedure, given: 49 (no arguments) Interactions:1:4: ((quote 49))
As in the preceding case, DrRacket sees sqrt(49) as
two separate commands: sqrt means “Find out what
sqrt is!” and (49) means “Call
the procedure 49, with no arguments!” DrRacket
responds to the first command by reporting that sqrt is
the primitive procedure for computing square roots and to the second
by pointing out that the number 49 is not a procedure.
Primary: [Front Door] [Schedule] - [Academic Honesty] [Disabilities] [Email] [FAQ] [IRC] [Teaching & Learning] [Grading]
Current: [Assignment] [EBoard] [Lab] [Outline] [Partners] [Reading]
Sections: [Assignments] [EBoards] [Examples] [Handouts] [Labs] [Outlines] [Partners] [Readings]
Reference: [Setup] - [Functions A-Z] [Functions By Topic] - [Racket] [Scheme Report (R5RS)] [R6RS] [TSPL4]
Related Courses: [Davis (2013F)] [Rebelsky (2010F)] [Weinman (2012F)]
Misc: [SamR] [Glimmer Labs] [CS@Grinnell] [Grinnell] [Issue Tracker (Course)]
Samuel A. Rebelsky, rebelsky@grinnell.edu
Copyright (c) 2007-2013 Janet Davis, Samuel A. Rebelsky, and Jerod Weinman. (Selected materials are copyright by John David Stone or Henry Walker and are used with permission.)

This work is licensed under a Creative Commons Attribution 3.0 Unported License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-nc/3.0/
or send a letter to Creative Commons, 543 Howard Street, 5th Floor,
San Francisco, California, 94105, USA.