; The File-system Data Design: (define-struct file [name size write? exec?]) ; A File is a (make-file String Nat Boolean Boolean) ; a file in a directory structure: ; - a name ; - a size in Bytes ; - 2 permission bits: the file is writeable/executable (define f-t (make-file "thomas.jpg" 1200 #f #f)) (define f-j (make-file "john.jpg" 1400 #f #f)) (define f-n (make-file "nicole.jpg" 1300 #f #f)) (define f-r (make-file "drracket" 1000000 #f #t)) (define f-c (make-file "2500-grades.xls" 10000 #t #f)) (define (file-templ file) (... (file-name file) ... (file-size file) ... (file-write? file) ... (file-exec? file) ...)) (define-struct dir [name entries]) ; A Dir is a (make-dir String [List-of Entry]) ; a directory (define d-0 (make-dir "Empty" '())) ; that's all we can do at this point! (define (dir-templ dir) (... (dir-name dir) ... (loe-templ (dir-entries dir)) ...)) ; An Entry is one of File or Dir ; a file or a directory (define e-0 f-t) (define (entry-templ entry) (... (cond [(file? entry) (... (file-templ entry) ...)] [(dir? entry) (... (dir-templ entry) ...)]) ...)) (define d-p (make-dir "Personal" (list f-t))) (define d-r (make-dir "Racket" (list f-r))) (define d-c (make-dir "Course" (list f-c))) (define d-t (make-dir "Wahl" (list d-p d-r d-c))) (define d-j (make-dir "Park" (list f-j))) (define d-b (make-dir "Brewer" (list f-n))) (define d-h (make-dir "Home" (list d-t d-j d-b))) ; The Page Data Design: (define-struct page [title links]) ; A Page is a (make-page String [List-of String]) ; a web page's title and links to other pages. (define page-0 (make-page "Khoury" (list "NEU"))) (define page-1 (make-page "NEU" (list "Khoury" "Boston"))) (define page-2 (make-page "Boston" (list "NEU" "Shillman Hall"))) (define page-3 (make-page "Shillman Hall" (list "NEU"))) (define page-4 (make-page "New Orleans" (list "Mardi Gras"))) (define (page-templ p) (... (page-title p) ... (los-templ (page-links p)) ...)) ; note: los-templ instead of lop-templ! (define (los-templ los) (... (cond [(empty? los) ...] [(cons? los) ... (first los) ... (los-templ (rest los))]))) ; A Wiki is a [List-of Page] ; a list of webpages (like the Internet) (define wiki-0 (list page-0 page-1 page-2 page-3 page-4)) ; page-links-by-title : String Wiki -> [List-of String] ; the list of page names linked to from the given page, ; or () if page not found (check-expect (page-links-by-title "Boston" wiki-0) (list "NEU" "Shillman Hall")) (check-expect (page-links-by-title "NOPAGE" wiki-0) '()) (define (page-links-by-title t wiki) (cond [(empty? wiki) '()] [(string=? (page-title (first wiki)) t) (page-links (first wiki))] [else (page-links-by-title t (rest wiki))]))