| CSC 153 | Grinnell College | Spring, 2005 |
| Computer Science Fundamentals | ||
| Laboratory Exercise | ||
This laboratory exercise provides experience with assignment as a mechanism to change a binding as a side effect of a procedure.
Consider the following definition sequence:
> (define str "original binding")
> (let ((str "second binding"))
(display "2: ") (display str) (newline)
(let ((str "third binding"))
(display "3: ") (display str) (newline)
(let ((str "fourth binding"))
(display "4: ") (display str) (newline)
(let ((str "fifth binding"))
(display "5: ") (display str) (newline))
(display "4: ") (display str) (newline))
(display "3: ") (display str) (newline))
(display "2: ") (display str) (newline))
Run this code, describe the output, and explain how that result is achieved.
Consider the following interaction that appears in the reading:
> (define ch #\A)
> ch
#\A
> (define ch #\B)
> ch
#\B
> (set! ch #\C)
> ch
#\C
> (set! ch #\D)
> ch
#\D
> (let ((ch #\E))
(display "0: ") (display ch) (newline)
(set! ch #\F)
(display "1: ") (display ch) (newline)
(set! ch #\G)
(display "2: ") (display ch) (newline)
(set! ch (integer->char 114))
(display "3: ") (display ch) (newline)
(set! ch "I'm tired of this game.")
(display "4: ") (display ch) (newline))
0: E
1: F
2: G
3: r
4: I'm tired of this game.
> ch
#\D
Review this interaction, and explain what happens at each step.
Here, ch is both a global and a local variable. Be sure you
can explain which value is changed when and why.
Consider the following definitions for insert-item,
insertion-sort, and sort-data:
(define insert-item
(lambda (item ls)
(if (or (null? ls) (<= item (car ls)))
(cons item ls)
(cons (car ls) (insert-item item (cdr ls)))
)
)
)
(define insertion-sort
(lambda (ls)
(if (null? ls)
ls
(insert-item (car ls) (insertion-sort (cdr ls)))
)
)
)
(define sort-data
(lambda ()
(set! data (insertion-sort data))
)
)
insert-item, insertion-sort,
and sort-data, and run the following sequence of operations:
(define data '(3 1 6 -8 4))
data
(sort-data)
data
Explain the results you obtain.
Next consider the following variation of insertion-sort that
changes its list parameter by changing its car and
cdr:
(define insertion-sort
(lambda (ls)
(letrec ((sort-data
(lambda (lst)
(if (null? lst)
lst
(insert-item (car lst) (sort-data (cdr lst)))))))
(let ((result (sort-data ls)))
(set-car! ls (car result))
(set-cdr! ls (cdr result))
result
)
)
)
)
insertion-sort, run the following
sequence of operations:
(define first '(3 1 6 -8 4))
first
(define second '(5 3 7 9 2 6 1 8))
second
(insertion-sort first)
(insertion-sort second)
first
second
insertion-sort produces its output; that is,
hypothesize how is the parameter changed.
result within the
let statement; what happens if this line is omitted?
(define insertion-sort
(lambda (ls)
(letrec ((sort-data
(lambda (lst)
(if (null? lst)
lst
(insert-item (car lst) (sort-data (cdr lst)))))))
(let ((result (sort-data ls)))
(set! ls result)
ls
)
)
)
)
Run this code with the same operations as for step 4, and describe the results.
Draw diagrams for the previous version of insertion-sort from
step 4 to clarify further why the code with set-car! and
set-cdr! works correctly -- even though the latest version
with (set! ls result) does not change the global variable.
This document is available on the World Wide Web as
http://www.cs.grinnell.edu/~walker/courses/153.sp05/labs/lab-mutation.shtml
|
created November 12, 1997 with parts taken from a lab by John
D. Stone, revised on March 8, 1998 revised January 11, 2000 by Henry M. Walker last revised February 3, 2005 |
|
| For more information, please contact Henry M. Walker at walker@cs.grinnell.edu. |