# Lab: Objects in Scheme

Summary: In this lab, we consider techniques for building objects, collections of data that support operations on those data.

Contents:

## Exercises

Start DrScheme.

### Exercise 1: Testing Switches

Here's the `make-switch` procedure from the reading.

```;;; Procedure:
;;;   make-switch
;;; Parameters:
;;;   None
;;; Purpose:
;;;   Creates a new switch in the off position.
;;; Produces:
;;;   newswitch, a switch
;;; Preconditions:
;;;   None
;;; Postconditions:
;;;   newswitch is an object which responds to two messages:
;;;     :show-position
;;;       Shows the current position ('on or 'off)
;;;     :toggle!
;;;       Switches the current position
(define make-switch
(lambda ()
(let ((state (vector #f)))   ; All switches are off when manufactured.
(lambda (message)
(cond ((eq? message ':show-position)
(if (vector-ref state 0) 'on 'off))
((eq? message ':toggle!)
(vector-set! state 0 (not (vector-ref state 0))))
(else (error "switch: unrecognized message")))))))
```

Test the switches created by the `make-switch` procedure. Here are a few possible instructions.

```> (define lamp-switch (make-switch))
> (define vacuum-cleaner-switch (make-switch))
> (lamp-switch ':show-position)
> (vacuum-cleaner-switch ':show-position)
> (lamp-switch ':toggle!)
> (lamp-switch ':show-position)
> (vacuum-cleaner-switch ':show-position)
> (lamp-switch ':toggle!)
> (vacuum-cleaner-switch ':toggle!)
> (lamp-switch ':show-position)
> (vacuum-cleaner-switch ':show-position)
```

### Exercise 2: A Single Tally Object

Define a one-field object, `tally`, that responds to exactly four messages:

• `':show-contents`,
• `':set-contents-to-zero!`,
• `':increment!`, which has the effect of increasing the number stored in the `contents` field by 1.
• `':decrement!`, which has the effect of decreasing the number stored in the `contents` field by 1.

The initial value of the field should be 0.

Note that you are creating an object, not a procedure that creates objects.

### Exercise 3: Making Generic Tallys

a. Define a `make-tally` procedure that constructs and returns objects similar to the `tally` object you defined in exercise 2.

b. Create two tally objects and demonstrate that they can be incremented and reset independently.

### Exercise 4: Tallys with Initial Values

Write a new `make-tally` procedure that allows the client to create new tallys with a specied initial value. For example, I might say that a starting grade is 90 with

```> (define grade (make-tally 90))
```

I would then increment and decrement it as students do good or bad work.

### Exercise 5: Monitored Tallys

a. Define a constructor procedure, `make-monitored-tally`, for objects similar to the `tally` objects from exercise 2 above, except that each such object keeps track of the total number of messages that it has received.

Hint: For this exercise, you will want to make a two-element vector. Element 0 of that vector will be the value of the tally. Element 1 of that vector will be the count of operations.

## History

Wednesday, 6 December 2001 [Samuel A. Rebelsky]

Tuesday, 1 May 2001 [Samuel A. Rebelsky]

Wednesday, 4 December 2002 [Samuel A. Rebelsky]

Monday, 5 May 2003 [Samuel A. rebelsky]

Disclaimer: I usually create these pages on the fly, which means that I rarely proofread them and they may contain bad grammar and incorrect details. It also means that I tend to update them regularly (see the history for more details). Feel free to contact me with any suggestions for changes.

This document was generated by Siteweaver on Tue May 6 09:29:06 2003.
The source to the document was last modified on Mon May 5 12:35:31 2003.
This document may be found at `http://www.cs.grinnell.edu/~rebelsky/Courses/CS151/2003S/Labs/objects.html`.

You may wish to validate this document's HTML ; ; Check with Bobby

Samuel A. Rebelsky, rebelsky@grinnell.edu