Blob


1 ;; The first three lines of this file were inserted by DrScheme. They record metadata
2 ;; about the language level of this file in a form that our tools can easily process.
3 #reader(lib "htdp-intermediate-reader.ss" "lang")((modname 18.1.14-2) (read-case-sensitive #t) (teachpacks ((lib "draw.ss" "teachpack" "htdp"))) (htdp-settings #(#t constructor repeating-decimal #f #t none #f ((lib "draw.ss" "teachpack" "htdp")))))
4 ;A web-page (wp) is a structure:
5 ;(make-wp header doc) where
6 ;header is a symbol and doc is
7 ;a web-document.
8 ;
9 ;A web-document (doc) is either
10 ;1. empty,
11 ;2. (cons sym doc) where sym is a symbol and
12 ;doc is a web-document, or
13 ;3. (cons wp doc) where wp is a webpage and
14 ;doc is a web-document.
16 (define-struct wp (header doc))
18 ;find-for-wp : wp symbol -> list-of-symbols or false. Given a-wp and a-symbol, return the headers of the web-pages that are accessed on the way to locating a-symbol within documents within a-wp. Returns false if a-symbol never occurs. If there are 2 or more occurrences of a-symbol, find-for-wp returns a list-of-headers from only a single occurrence by following the path that gives preference to web-pages before embedded web pages.
20 (define (find-for-wp a-wp a-symbol)
21 (cond
22 [(or (cons? (find-for-doc (wp-doc a-wp) a-symbol))
23 (empty? (find-for-doc (wp-doc a-wp) a-symbol))) (cons (wp-header a-wp) (find-for-doc (wp-doc a-wp) a-symbol))]
24 [else false]))
26 ;find-for-doc : doc symbol -> list-of-symbols or false
27 ;Given a-doc and a-symbol, return the headers of the web-pages that are accessed on the way to locating a-symbol within documents within a-doc (a-doc inclusive). Returns false if a-symbol never occurs. Return empty if a-doc contains a-symbol. If there are 2 or more occurrences of a-symbol, find-for-doc returns the list-of-headers from only a single occurrence by following the path that gives preference to web-pages before embedded web pages.
29 (define (find-for-doc a-doc a-symbol)
30 (cond
31 [(empty? a-doc) false]
32 [(symbol? (first a-doc))
33 (cond
34 [(symbol=? a-symbol (first a-doc)) empty]
35 [else (find-for-doc (rest a-doc) a-symbol)])]
36 [(wp? (first a-doc))
37 (cond
38 [(or (cons? (find-for-wp (rest a-doc) a-symbol))
39 (empty? (find-for-wp (rest a-doc) a-symbol))) (find-for-wp (rest a-doc) a-symbol)]
40 [(or (cons? (find-for-wp (first a-doc) a-symbol))
41 (empty? (find-for-wp (first a-doc) a-symbol))) (find-for-wp (first a-doc) a-symbol)])]))