<div dir="ltr">A candidate for a solution.<div><br></div><div><div>;; model 3</div><div>(define-struct file (name size content))</div><div>(define-struct dir (name dirs files))</div><div><br></div><div>;; files:</div><div>

(define hang (make-file 'hang 8 empty))</div><div>(define draw (make-file 'draw 2 empty))</div><div>(define read (make-file 'read! 19 empty))</div><div>(define one  (make-file 'part1 99 empty))</div><div>
(define two  (make-file 'part2 52 empty))</div>
<div>(define thre (make-file 'part3 17 empty))</div><div>(define rdme (make-file 'read 10 empty))</div><div><br></div><div>;; directories:</div><div>(define Code (make-dir 'Code '() (list hang draw)))</div>

<div>(define Docs (make-dir 'Docs '() (list read)))</div><div>(define Libs (make-dir 'Libs (list Code Docs) '()))</div><div>(define Text (make-dir 'Text '() (list one two thre)))</div><div>(define Top  (make-dir 'TS (list Text Libs) (list rdme)))</div>

<div><br></div><div>;; dur-dir :: dir -> number</div><div>;; consumes a directory producing a sum of the list of files in each.</div><div>;; to the sum, it'll add 1 for each directory it finds. (we're assuming</div>

<div>;; each directory is of size 1).</div><div>(define (du-dir d)</div><div>  (+ 1 (sum-files (dir-files d)) (du-dir-subdir (dir-dirs d))))</div><div><br></div><div>(define (du-dir-subdir ls)</div><div>  (cond</div><div>

   [(empty? ls) 0]</div><div>   [(dir? (first ls))</div><div>    (+ (du-dir (first ls))</div><div>       (du-dir-subdir (rest ls)))]))</div><div><br></div><div>;; sum-files :: ls-of-files -> number</div><div>;; consumes a list of files producing the sum of their sizes</div>

<div>(define (sum-files ls)</div><div>  (cond</div><div>   [(empty? ls) 0]</div><div>   [else (+ (file-size (first ls))</div><div>            (sum-files (rest ls)))]))</div><div><br></div><div>;; tests</div><div>(check-expect </div>

<div> (sum-files (list hang draw)) </div><div> 10)</div><div><br></div><div>(check-expect </div><div> (sum-files empty) </div><div> 0)</div><div><br></div><div>(check-expect </div><div> (du-dir Libs)</div><div> (+ 8 2 19 1 1 1))</div>

<div><br></div></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div dir="ltr"><div>Source:<br></div><div><a href="http://www.htdp.org/2003-09-26/Solutions/file-du.html" target="_blank">http://www.htdp.org/2003-09-26/Solutions/file-du.html</a></div><div><h1 style="color:rgb(0,0,0);font-family:'Times New Roman'">

No Solution Written, yet</h1><span style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium">Unfortunately, the solution to this exercise has not yet been written. To submit a solution you have written to this problem, or to complain that the solution isn't available, please contact </span><a href="mailto:robby@eecs.northwestern.edu?subject=missing%20solution%2016.3.3%20ex:file-du%20" target="_blank" style="font-family:'Times New Roman';font-size:medium">Robby Findler</a><span style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium">.</span><p style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium">

To see the list of solutions, visit the <a href="http://www.htdp.org/2003-09-26/Solutions/contents.html" target="_blank">table of contents</a>. Each of the hyperlinked exercise numbers has a solution.</p></div></div></blockquote>

</div></div></div>