Fundamentals of Computer Science I (CS151.01 2006F)
[Skip to Body]
Primary:
[Front Door]
[Syllabus]
[Glance]
[Search]

[Academic Honesty]
[Instructions]
Current:
[Outline]
[EBoard]
[Reading]
[Lab]
[Homework]
Groupings:
[EBoards]
[Examples]
[Exams]
[Handouts]
[Homework]
[Labs]
[Outlines]
[Projects]
[Readings]
Reference:
[Scheme Report (R5RS)]
[Scheme Reference]
[DrScheme Manual]
Related Courses:
[CSC151.02 2006F (Davis)]
[CSCS151 2005S (Stone)]
[CSC151 2003F (Rebelsky)]
[CSC153 2004S (Rebelsky)]
Back to Unit Testing. On to Local Procedure Bindings.
This outline is also available in PDF.
Held: Wednesday, 27 September 2006
Summary:
Today we consider how to bind names to values using Scheme's various kinds of let
expressions.
Related Pages:
Notes:
Overview:
let
.let*
.closesttozero
(define closesttozero (lambda (lst) (cond ; If there's only one element in the list, it's closest to zero ((null? (cdr lst)) (car lst)) ; If the current element is closer to zero than the closest ; remaining thing, use that ((< (abs (car lst)) (abs (closesttozero (cdr lst)))) (car lst)) ; Otherwise, use the thing in the remainder closest to zero (else (closesttozero (cdr lst))))))
closesttozeo
may get called repeatedly with the same parameters. (We'll check that with some sample code.)
closesttozero
, we
can make one by naming the result and using it twice. One
possibility is to use a helper procedure
(define closesttozero (lambda (lst) (if (null? (cdr lst) (car lst) (closertozero (car lst) (closesttozero (cdr lst))))))) (define closertozero (lambda (guess1 guess2) (if (< (abs guess1) (abs guess2)) guess1 guess2)))
(define closesttozero (lambda (lst) (cond ((null? (cdr lst)) (car lst)) "Compute (closesttozero (cdr lst)) and call it guess" (if (< (abs (car lst)) (abs guess)) (car lst) guess))))
let
let
.
let
has the form
(let ((name_{1} exp_{1}) (name_{2} exp_{2}) ... (name_{n} exp_{n})) body)
let
has the meaning:
let
in a simple expression:
(define values (list 1 4 2 4 1 5 9)) (let ((largest (max values)) (smallest (min values))) (/ (+ largest smallest) 2))
let
within a procedure.
Here's a new version of closesttozero
that uses
let
.
(define closesttozero (lambda (lst) ; If there's only one element in the list, it's closest to zero (if (null? (cdr lst)) (car lst) ; Otherwise, find the remaining element closest to zero and ; call it guess (let ((guess (closesttozero (cdr lst)))) ; Choose the closer to zero of the first element and guess (if (< (abs (car lst)) (abs guess)) (car lst) guess)))))
let*
let*
rather than let
.
let*
has the form
(let* ((name_{1} exp_{1}) (name_{2} exp_{2}) ... (name_{n} exp_{n})) body)
let*
has the meaning:
closesttozero
that makes closertozero
a helper.
(define closesttozero (let ((closertozero (lambda (guess1 guess2) (if (< (abs guess1) (abs guess2)) guess1 guess2)))) (lambda (lst) (if (null? (cdr lst)) (car lst) (closertozero (car lst) (closesttozero (cdr lst)))))))
;;; Procedure: ;;; exactaverage ;;; Parameters: ;;; num1, an exact number ;;; num2, an exact number ;;; Purpose: ;;; Average the two numbers. ;;; Produces: ;;; average, an exact number ;;; Preconditions: ;;; num1 is an exact number [Verified] ;;; num2 is an exact number [Verified] ;;; Postconditions: ;;; Guess. (define exactaverage (lambda (num1 num2) (let ((verify? (lambda (val) (and (number? val) (exact? val))))) (cond ((not (verify? num1)) (error "exactaverage" "first parameter is a nonnumber")) ((not (verify? num2)) (error "exactaverage" "second parameter is a nonnumber")) (else (/ (+ num1 num2) 2))))))
Back to Unit Testing. On to Local Procedure Bindings.
[Skip to Body]
Primary:
[Front Door]
[Syllabus]
[Glance]
[Search]

[Academic Honesty]
[Instructions]
Current:
[Outline]
[EBoard]
[Reading]
[Lab]
[Homework]
Groupings:
[EBoards]
[Examples]
[Exams]
[Handouts]
[Homework]
[Labs]
[Outlines]
[Projects]
[Readings]
Reference:
[Scheme Report (R5RS)]
[Scheme Reference]
[DrScheme Manual]
Related Courses:
[CSC151.02 2006F (Davis)]
[CSCS151 2005S (Stone)]
[CSC151 2003F (Rebelsky)]
[CSC153 2004S (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 Thu Nov 30 21:43:26 2006.
The source to the document was last modified on Mon Sep 4 08:43:33 2006.
This document may be found at http://www.cs.grinnell.edu/~rebelsky/Courses/CS151/2006F/Outlines/outline.20.html
.
You may wish to validate this document's HTML ; ;
Samuel A. Rebelsky, rebelsky@grinnell.eduhttp://creativecommons.org/licenses/bync/2.5/
or send a letter to Creative Commons, 543 Howard Street, 5th Floor,
San Francisco, California, 94105, USA.