;; The first three lines of this file were inserted by DrScheme. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-advanced-reader.ss" "lang")((modname lect04a) (read-case-sensitive #t) (teachpacks ((lib "world.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #t #t none #f ((lib "world.ss" "teachpack" "htdp"))))) #| The steps of design recipe (taken from How to Design Programs). 1. Data Def'n 2. Examples of Data 3. Template for functions handling the data 4a Write function header b Write function comments c Write test cases d Write function body i. a cond line for each variant of union data ii. pull out fields for each line handling a struct iii. add natural-recursion call, if present. 5. run tests |# ; Data Def'n: ; A treenode is: ; - 'unknown ; - (make-person string num symbol treenode treenode) (define-struct person (name year eye ma pa)) (define abe (make-person "Abe" 1920 'blue 'unknown 'unknown)) (define mona (make-person "Mona" 1929 'brown 'unknown 'unkown)) (make-person "homer" 1955 'brown (make-person "Mona" 1929 'brown 'unknown 'unkown) (make-person "Abe" 1920 'blue 'unknown 'unknown)) (define jackie (make-person "Jackie" 1926 'brown 'unknown 'unknown)) (define marge (make-person "Marge" 1956 'blue jackie 'unknown)) (define homer (make-person "Homer" 1955 'brown mona abe)) (define bart (make-person "Bart" 1979 'brown homer marge)) #;(define (fun-for-tnode a-ft) (cond [(symbol? a-ft) ...] [(person? a-ft) (person-name a-ft) ... (person-year a-ft) ... (person-eye a-ft) ... (fun-for-tnode (person-ma a-ft)) ... (fun-for-tnode (person-pa a-ft)) ... ])) ;;;; Spent most of the hour discussing hw soln. ; find-all-name : (-> treenode string (list-of person)) ; (define (find-all-name a-ft target-name) (cond [(symbol? a-ft) empty] [(person? a-ft) (if (string=? target-name (person-name a-ft)) (cons a-ft (append (find-all-name (person-ma a-ft) target-name) (find-all-name (person-pa a-ft) target-name))) (append (find-all-name (person-ma a-ft) target-name) (find-all-name (person-pa a-ft) target-name)))])) (check-expect (find-all-name 'unknown "Beatrix") empty) (check-expect (find-all-name homer "Beatrix") empty) (check-expect (find-all-name homer "Homer") (list homer))