Blame


1 12687dd9 2023-08-04 jrmu ;; The first three lines of this file were inserted by DrScheme. They record metadata
2 12687dd9 2023-08-04 jrmu ;; about the language level of this file in a form that our tools can easily process.
3 12687dd9 2023-08-04 jrmu #reader(lib "htdp-intermediate-reader.ss" "lang")((modname 15.3.1) (read-case-sensitive #t) (teachpacks ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ((lib "draw.ss" "teachpack" "htdp") (lib "arrow.ss" "teachpack" "htdp")))))
4 12687dd9 2023-08-04 jrmu ;A web-page (wp) is a structure:
5 12687dd9 2023-08-04 jrmu ;(make-wp header doc) where
6 12687dd9 2023-08-04 jrmu ;header is a symbol and doc is
7 12687dd9 2023-08-04 jrmu ;a web-document.
8 12687dd9 2023-08-04 jrmu ;
9 12687dd9 2023-08-04 jrmu ;A web-document (doc) is either
10 12687dd9 2023-08-04 jrmu ;1. empty,
11 12687dd9 2023-08-04 jrmu ;2. (cons sym doc) where sym is a symbol and
12 12687dd9 2023-08-04 jrmu ;doc is a web-document, or
13 12687dd9 2023-08-04 jrmu ;3. (cons wp doc) where wp is a webpage and
14 12687dd9 2023-08-04 jrmu ;doc is a web-document.
15 12687dd9 2023-08-04 jrmu
16 12687dd9 2023-08-04 jrmu (define-struct wp (header doc))
17 12687dd9 2023-08-04 jrmu ;
18 12687dd9 2023-08-04 jrmu ;Template
19 12687dd9 2023-08-04 jrmu ;fun-for-wp : wp -> ???
20 12687dd9 2023-08-04 jrmu ;(define (fun-for-wp a-wp)
21 12687dd9 2023-08-04 jrmu ; ... (wp-header a-wp) ...
22 12687dd9 2023-08-04 jrmu ; ... (fun-for-doc (wp-doc a-wp)) ...)
23 12687dd9 2023-08-04 jrmu ;
24 12687dd9 2023-08-04 jrmu ;fun-for-doc : doc -> ???
25 12687dd9 2023-08-04 jrmu ;(define (fun-for-doc a-doc)
26 12687dd9 2023-08-04 jrmu ; (cond
27 12687dd9 2023-08-04 jrmu ; [(empty? a-doc) ...]
28 12687dd9 2023-08-04 jrmu ; [(symbol? (first a-doc))
29 12687dd9 2023-08-04 jrmu ; ... (first a-doc) ...
30 12687dd9 2023-08-04 jrmu ; ... (fun-for-doc (rest a-doc)) ...]
31 12687dd9 2023-08-04 jrmu ; [(wp? (first a-doc))
32 12687dd9 2023-08-04 jrmu ; ... (fun-for-wp (first a-doc)) ...
33 12687dd9 2023-08-04 jrmu ; ... (fun-for-doc (rest a-doc)) ...]))
34 12687dd9 2023-08-04 jrmu ;
35 12687dd9 2023-08-04 jrmu
36 12687dd9 2023-08-04 jrmu ;size : wp -> number
37 12687dd9 2023-08-04 jrmu ;Given a-wp, determine the number of
38 12687dd9 2023-08-04 jrmu ;symbols it contains.
39 12687dd9 2023-08-04 jrmu
40 12687dd9 2023-08-04 jrmu (define (size a-wp)
41 12687dd9 2023-08-04 jrmu (+ 1
42 12687dd9 2023-08-04 jrmu (size-doc (wp-doc a-wp))))
43 12687dd9 2023-08-04 jrmu ;
44 12687dd9 2023-08-04 jrmu ;size-doc : doc -> number
45 12687dd9 2023-08-04 jrmu ;Given a-doc, determine the size
46 12687dd9 2023-08-04 jrmu ;of the doc, which is the number
47 12687dd9 2023-08-04 jrmu ;of symbols it contains.
48 12687dd9 2023-08-04 jrmu ;
49 12687dd9 2023-08-04 jrmu (define (size-doc a-doc)
50 12687dd9 2023-08-04 jrmu (cond
51 12687dd9 2023-08-04 jrmu [(empty? a-doc) 0]
52 12687dd9 2023-08-04 jrmu [(symbol? (first a-doc)) (+ 1
53 12687dd9 2023-08-04 jrmu (size-doc (rest a-doc)))]
54 12687dd9 2023-08-04 jrmu [(wp? (first a-doc)) (+ (size (first a-doc))
55 12687dd9 2023-08-04 jrmu (size-doc (rest a-doc)))]))
56 12687dd9 2023-08-04 jrmu ;Tests
57 12687dd9 2023-08-04 jrmu ;
58 12687dd9 2023-08-04 jrmu (define DOC7 (cons 'ImADoc empty))
59 12687dd9 2023-08-04 jrmu (define DOC6 (cons 'ImADocToo empty))
60 12687dd9 2023-08-04 jrmu (define WP3 (make-wp 'ImAPage empty))
61 12687dd9 2023-08-04 jrmu (define DOC5 (cons WP3 DOC6))
62 12687dd9 2023-08-04 jrmu (define WP2 (make-wp 'AmIAPageToo? DOC5))
63 12687dd9 2023-08-04 jrmu (define DOC4 (cons 'MaybeADoc DOC7))
64 12687dd9 2023-08-04 jrmu (define DOC3 (cons WP2 DOC4))
65 12687dd9 2023-08-04 jrmu (define DOC2 (cons 'ADoctor? DOC3))
66 12687dd9 2023-08-04 jrmu (define DOC1 (cons 'OrADocument? DOC2))
67 12687dd9 2023-08-04 jrmu (define WP1 (make-wp 'NoAWebPage DOC1))
68 12687dd9 2023-08-04 jrmu ;
69 12687dd9 2023-08-04 jrmu ;(size WP1)
70 12687dd9 2023-08-04 jrmu ;8
71 12687dd9 2023-08-04 jrmu
72 12687dd9 2023-08-04 jrmu ;wp-to-file : wp -> list-of-symbols
73 12687dd9 2023-08-04 jrmu ;Given a-wp, produces a list-of-symbols containing
74 12687dd9 2023-08-04 jrmu ;all the symbols in the headers of all web pages
75 12687dd9 2023-08-04 jrmu ;and all the symbols within the body of a-wp,
76 12687dd9 2023-08-04 jrmu ;excluding the bodies of immediately embedded
77 12687dd9 2023-08-04 jrmu ;webpages.
78 12687dd9 2023-08-04 jrmu ;
79 12687dd9 2023-08-04 jrmu ;Examples:
80 12687dd9 2023-08-04 jrmu
81 12687dd9 2023-08-04 jrmu (define WP-6 (make-wp 'ThisIsARepeat empty))
82 12687dd9 2023-08-04 jrmu (define DOC-8 (cons WP-6 empty))
83 12687dd9 2023-08-04 jrmu (define DOC-7 (cons 'ThisIsARepeat empty))
84 12687dd9 2023-08-04 jrmu (define WP-5 (make-wp 'RepetionSuccess DOC-8))
85 12687dd9 2023-08-04 jrmu (define DOC-6 (cons WP-5 DOC-7))
86 12687dd9 2023-08-04 jrmu (define WP-4 (make-wp 'ThisIsARepeat DOC-6))
87 12687dd9 2023-08-04 jrmu (define DOC-5.5 (cons WP-4 empty))
88 12687dd9 2023-08-04 jrmu (define DOC-5 (cons 'NotIncluded DOC-5.5))
89 12687dd9 2023-08-04 jrmu (define DOC-4 (cons 'ThisIsAnExample empty))
90 12687dd9 2023-08-04 jrmu (define WP-3 (make-wp 'MyHeader empty))
91 12687dd9 2023-08-04 jrmu (define DOC-2 (cons WP-3 DOC-4))
92 12687dd9 2023-08-04 jrmu (define WP-2 (make-wp 'ThisIsAHeader DOC-5))
93 12687dd9 2023-08-04 jrmu (define DOC-1 (cons WP-2 DOC-2))
94 12687dd9 2023-08-04 jrmu (define WP-1 (make-wp 'TheHighestWP DOC-1))
95 12687dd9 2023-08-04 jrmu
96 12687dd9 2023-08-04 jrmu ;(wp-to-file WP-1)
97 12687dd9 2023-08-04 jrmu ;'(TheHighestWP ThisIsAHeader MyHeader ThisIsAnExample))
98 12687dd9 2023-08-04 jrmu ;Notice that 'NotIncluded does not show up because
99 12687dd9 2023-08-04 jrmu ;it is the body of an embedded web-page.
100 12687dd9 2023-08-04 jrmu ;
101 12687dd9 2023-08-04 jrmu ;wp-to-file : wp -> list-of-symbols
102 12687dd9 2023-08-04 jrmu (define (wp-to-file a-wp)
103 12687dd9 2023-08-04 jrmu (append (list (wp-header a-wp))
104 12687dd9 2023-08-04 jrmu (wp-to-file-for-doc (wp-doc a-wp))))
105 12687dd9 2023-08-04 jrmu ;
106 12687dd9 2023-08-04 jrmu ;wp-to-file-for-doc : doc -> list-of-symbols
107 12687dd9 2023-08-04 jrmu ;Given a-doc, produces a list-of-symbols containing all the
108 12687dd9 2023-08-04 jrmu ;symbols found within the body of the document as well
109 12687dd9 2023-08-04 jrmu ;as the headers of embedded web pages. It does not
110 12687dd9 2023-08-04 jrmu ;return the symbols of the bodies of the embedded
111 12687dd9 2023-08-04 jrmu ;web pages, however.
112 12687dd9 2023-08-04 jrmu
113 12687dd9 2023-08-04 jrmu (define (wp-to-file-for-doc a-doc)
114 12687dd9 2023-08-04 jrmu (cond
115 12687dd9 2023-08-04 jrmu [(empty? a-doc) empty]
116 12687dd9 2023-08-04 jrmu [(symbol? (first a-doc))
117 12687dd9 2023-08-04 jrmu (append (list (first a-doc))
118 12687dd9 2023-08-04 jrmu (wp-to-file-for-doc (rest a-doc)))]
119 12687dd9 2023-08-04 jrmu [(wp? (first a-doc))
120 12687dd9 2023-08-04 jrmu (append (list (wp-header (first a-doc)))
121 12687dd9 2023-08-04 jrmu (wp-to-file-for-doc (rest a-doc)))]))
122 12687dd9 2023-08-04 jrmu
123 12687dd9 2023-08-04 jrmu
124 12687dd9 2023-08-04 jrmu ;occurs : symbol wp -> boolean
125 12687dd9 2023-08-04 jrmu ;Given a-symbol and a-wp, determine if
126 12687dd9 2023-08-04 jrmu ;a-symbol appears anywhere in the webpage,
127 12687dd9 2023-08-04 jrmu ;including in embedded webpages.
128 12687dd9 2023-08-04 jrmu
129 12687dd9 2023-08-04 jrmu (define (occurs a-symbol a-wp)
130 12687dd9 2023-08-04 jrmu (cond
131 12687dd9 2023-08-04 jrmu [(symbol=? a-symbol (wp-header a-wp)) true]
132 12687dd9 2023-08-04 jrmu [else (occurs-doc a-symbol (wp-doc a-wp))]))
133 12687dd9 2023-08-04 jrmu
134 12687dd9 2023-08-04 jrmu ;occurs-doc : symbol doc -> boolean
135 12687dd9 2023-08-04 jrmu ;Given a-symbol and a-doc, determine if
136 12687dd9 2023-08-04 jrmu ;a-symbol is anywhere within a-doc, including
137 12687dd9 2023-08-04 jrmu ;in embedded web pages.
138 12687dd9 2023-08-04 jrmu
139 12687dd9 2023-08-04 jrmu (define (occurs-doc a-symbol a-doc)
140 12687dd9 2023-08-04 jrmu (cond
141 12687dd9 2023-08-04 jrmu [(empty? a-doc) false]
142 12687dd9 2023-08-04 jrmu [(symbol? (first a-doc))
143 12687dd9 2023-08-04 jrmu (cond
144 12687dd9 2023-08-04 jrmu [(symbol=? a-symbol (first a-doc)) true]
145 12687dd9 2023-08-04 jrmu [else (occurs-doc a-symbol (rest a-doc))])]
146 12687dd9 2023-08-04 jrmu [(wp? (first a-doc))
147 12687dd9 2023-08-04 jrmu (or
148 12687dd9 2023-08-04 jrmu (occurs a-symbol (first a-doc))
149 12687dd9 2023-08-04 jrmu (occurs-doc a-symbol (rest a-doc)))]))
150 12687dd9 2023-08-04 jrmu
151 12687dd9 2023-08-04 jrmu ;Test
152 12687dd9 2023-08-04 jrmu ;(wp-to-file WP-1)
153 12687dd9 2023-08-04 jrmu
154 12687dd9 2023-08-04 jrmu ;find-for-wp : wp symbol -> list-of-symbols/false
155 12687dd9 2023-08-04 jrmu ;Given a-wp and a-symbol, returns a list-of-symbols containing
156 12687dd9 2023-08-04 jrmu ;all the headers encountered on the way to find the symbol.
157 12687dd9 2023-08-04 jrmu ;Returns empty if the symbol does not occur.
158 12687dd9 2023-08-04 jrmu
159 12687dd9 2023-08-04 jrmu ;find-for-wp : wp symbol -> list-of-symbols/false
160 12687dd9 2023-08-04 jrmu (define (find-for-wp a-wp a-symbol)
161 12687dd9 2023-08-04 jrmu (cond
162 12687dd9 2023-08-04 jrmu [(occurs a-symbol a-wp) (append (list (wp-header a-wp))
163 12687dd9 2023-08-04 jrmu (find-for-doc (wp-doc a-wp) a-symbol))]
164 12687dd9 2023-08-04 jrmu [else empty]))
165 12687dd9 2023-08-04 jrmu
166 12687dd9 2023-08-04 jrmu ;find-for-doc : doc -> list-of-symbols/false
167 12687dd9 2023-08-04 jrmu ;Given a-doc and a-symbol, returns a list-of-symbols containing
168 12687dd9 2023-08-04 jrmu ;all the headers encountered on the way to find a symbol.
169 12687dd9 2023-08-04 jrmu ;Returns empty if the symbol does not occur.
170 12687dd9 2023-08-04 jrmu
171 12687dd9 2023-08-04 jrmu (define (find-for-doc a-doc a-symbol)
172 12687dd9 2023-08-04 jrmu (cond
173 12687dd9 2023-08-04 jrmu [(empty? a-doc) empty]
174 12687dd9 2023-08-04 jrmu [(symbol? (first a-doc))
175 12687dd9 2023-08-04 jrmu (find-for-doc (rest a-doc) a-symbol)]
176 12687dd9 2023-08-04 jrmu [(wp? (first a-doc)) (append (find-for-wp (first a-doc) a-symbol)
177 12687dd9 2023-08-04 jrmu (find-for-doc (rest a-doc) a-symbol))]))
178 12687dd9 2023-08-04 jrmu
179 12687dd9 2023-08-04 jrmu ;find : wp symbol -> list-of-symbols/false
180 12687dd9 2023-08-04 jrmu ;Given a-wp and a-symbol, return the headers
181 12687dd9 2023-08-04 jrmu ;of the web-pages that are accessed on the way
182 12687dd9 2023-08-04 jrmu ;to locating a-symbol. Returns false
183 12687dd9 2023-08-04 jrmu ;if a-symbol never occurs.
184 12687dd9 2023-08-04 jrmu
185 12687dd9 2023-08-04 jrmu (define (find a-wp a-symbol)
186 12687dd9 2023-08-04 jrmu (cond
187 12687dd9 2023-08-04 jrmu [(empty? (find-for-wp a-wp a-symbol)) false]
188 12687dd9 2023-08-04 jrmu [else (find-for-wp a-wp a-symbol)]))