Lecture 4, June 26
The lecture notes I post serve two purposes: to remind you of the topics we discussed and to provide any interesting code examples I did during lecture. I would describe these notes as an outline, not a summary, of what I talked about during lecture. You are not expected to be able to learn the material simply from examining these notes, nor is reading these notes a reasonable substitute for attending lecture.
Code
We spent this lecture practicing with structures.
#lang typed/racket (require "../include/uchicago151.rkt") (define-struct Spider ([num-legs : Nonnegative-Integer] [space-needed : Real] [age : Integer])) (define-struct Elephant ([space-needed : Real] [age : Integer])) (define-struct BoaConstrictor ([length : Real] [girth : Real] [age : Integer])) (define-struct Armadillo ([name : String] [space-needed : Real] [age : Integer])) (define-type Animal (U Spider Elephant BoaConstrictor Armadillo)) ;(define-struct Zoo ; ([spider-num-legs : Integer] ; [spider-space-needed : Real] ; [spider-age : Integer] ; [elephant-space-needed : Real] ; ....)) (define-struct Zoo ([spider : Spider] [elephant : Elephant] [boaconstrictor : BoaConstrictor] [armadillo : Armadillo])) ;(: template-function (Animal -> ....)) ;(define (template-function animal) ; (cond ; [(Spider? animal) ...] ; [(Elephant? animal) ...] ; [(BoaConstrictor? animal) ...] ; [(Armadillo? animal ...)])) (: fits? (Animal Real -> Boolean)) (define (fits? animal volume) (cond [(Spider? animal) (>= volume (Spider-space-needed animal))] [(Elephant? animal) (>= volume (Elephant-space-needed animal))] [(BoaConstrictor? animal) (>= volume (* (BoaConstrictor-length animal) (* pi (sqr (/ (BoaConstrictor-girth animal) 2 pi)))))] [(Armadillo? animal) (>= volume (Armadillo-space-needed animal))])) (: update-spider (Spider -> Spider)) (define (update-spider s) (make-Spider (Spider-num-legs s) (Spider-space-needed s) (+ 1 (Spider-age s)))) (: update-elephant (Elephant -> Elephant)) (define (update-elephant e) (make-Elephant (Elephant-space-needed e) (+ 1 (Elephant-age e)))) (: update-boaconstrictor (BoaConstrictor -> BoaConstrictor)) (define (update-boaconstrictor b) (make-BoaConstrictor (BoaConstrictor-length b) (BoaConstrictor-girth b) (+ 1 (BoaConstrictor-age b)))) (: update-armadillo (Armadillo -> Armadillo)) (define (update-armadillo a) (make-Armadillo (Armadillo-name a) (Armadillo-space-needed a) (+ 1 (Armadillo-age a)))) ; Example: (update-age (make-Spider 5 12 3)) ; -> (make-Spider 5 12 4) (: update-age (Animal -> Animal)) ; Increases the age of the animal by 1 (define (update-age animal) (cond [(Spider? animal) (update-spider animal)] [(Elephant? animal) (update-elephant animal)] [(BoaConstrictor? animal) (update-boaconstrictor animal)] [(Armadillo? animal) (update-armadillo animal)])) (: update-all-ages (Zoo -> Zoo)) (define (update-all-ages zoo) (make-Zoo (update-spider (Zoo-spider zoo)) (update-elephant (Zoo-elephant zoo)) (update-boaconstrictor (Zoo-boaconstrictor zoo)) (update-armadillo (Zoo-armadillo zoo)))) ; Define a structure Point for representing a point in a 2D plane ; Points should have a x and a y (define-struct Point ([x : Real] [y : Real])) ; Define a function dist that determines the distance between two points ; E.g. (dist (Point 1 2) (Point 4 6)) -> 5 (: dist (Point Point -> Real)) (define (dist p q) (sqrt (+ (sqr (- (Point-x p) (Point-x q))) (sqr (- (Point-y p) (Point-y q)))))) ; Define a function pt-eq? that determines whether two points are equal. ; Two points are equal if and only if they have the same x and the same y (: pt-eq? (Point Point -> Boolean)) (define (pt-eq? p q) (and (= (Point-x p) (Point-x q)) (= (Point-y p) (Point-y q)))) ; Define a structure Rect for representing rectangles. Represent rectangles ; with their lower left and upper right corners using the Point structure above (define-struct Rect ([ll : Point] [ur : Point])) ; Write a function valid-rect? that determines whether the first point in the ; rectangle is actually the lower left and the second is actually the upper right (: valid-rect? (Rect -> Boolean)) (define (valid-rect? r) (and (> (Point-x (Rect-ur r)) (Point-x (Rect-ll r))) (> (Point-y (Rect-ur r)) (Point-x (Rect-ll r))))) ; Write a function rect-area that determines the area of a rectangle (: rect-area (Rect -> Real)) (define (rect-area r) (* (- (Point-x (Rect-ur r)) (Point-x (Rect-ll r))) (- (Point-y (Rect-ur r)) (Point-y (Rect-ll r))))) ; Write a function inside? that determines whether a point lies inside a rectangle (: inside? (Rect Point -> Boolean)) (define (inside? r p) (and (< (Point-x (Rect-ll r)) (Point-x p)) (< (Point-x p) (Point-x (Rect-ur r))) (< (Point-y (Rect-ll r)) (Point-x p)) (< (Point-y p) (Point-y (Rect-ur r))))) ; Write a function contained? that takes two rectangles as input and determines ; whether the first is entirely contained inside the second. Hint: check if the ; lower left and upper right corners of the first are inside the second. (: contained? (Rect Rect -> Boolean)) (define (contained? a b) (and (inside? b (Rect-ur a)) (inside? b (Rect-ll a))))