;; The first three lines of this file were inserted by DrRacket. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-beginner-abbr-reader.ss" "lang")((modname 6-demo) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ()))) ; A file is either: ; * a raw-file, or ; * a dir (short for directory) ; A dir is a structure ; (make-dir lonf) where lonf is a list-of-namedFile (define-struct dir (namedFiles)) ; A list-of-namedFile is a form of list-of-alpha. ; A namedFile is a structure1 ; (make-namedFile name f) where name is a symbol and f is a file. (define-struct namedFile (name file)) ; file-size: file -> N ; Purpose: (file-size f) counts the number of files in f ; dir-size: dir -> N ; lonf-size: lonf -> N ; namedFile-size: namedFile -> N ; Template Instantiations: #| (define (file-size f) (cond [(raw-file? f) ...] ; process raw file [(dir? f) ... (dir-size f) ... ])) (define (dir-size d) ... (lonf-size (dir-namedFile d)) ... ) (define (lonf-size lonf) (cond [(empty? lonf) ... ] [(cons? lonf) ... ... (namedFile-size (first lonf)) ... ... (lonf-size (rest lonf)) ... ])) (define (namedFile-size nf) ... (namedFile-name nf) ... ... (file-size (namedFile-file nf)) ... ) |# ; Examples (define file1 empty) (define file2 empty) (define namedFile1 (make-namedFile 'namedFile1 file1)) (define namedFile2 (make-namedFile 'namedFile2 file2)) (define lonf1 (list namedFile1 namedFile2)) (define dir1 (make-dir empty)) (define dir2 (make-dir lonf1)) (define namedFile3 (make-namedFile 'dir1 dir1)) (define namedFile4 (make-namedFile 'dir2 dir2)) (define lonf2 (list namedFile3 namedFile4 namedFile1)) ; Examples (check-expect (dir-size dir1) 1) (check-expect (dir-size dir2) 3) (check-expect (lonf-size lonf1) 2) (check-expect (namedFile-size namedFile1) 1) (check-expect (namedFile-size namedFile2) 1) (check-expect (namedFile-size namedFile3) 1) (check-expect (namedFile-size namedFile4) 3) (check-expect (lonf-size lonf2) 5) (define (file-size f) (cond [(empty? f) 1] ; process raw file [(dir? f) (dir-size f)])) (define (dir-size d) (add1 (lonf-size (dir-namedFiles d)))) (define (lonf-size lonf) (cond [(empty? lonf) 0] [(cons? lonf) (+ (namedFile-size (first lonf)) (lonf-size (rest lonf)))])) (define (namedFile-size nf) (file-size (namedFile-file nf)))