RU beehive logo ITEC dept promo banner
ITEC 380
2008fall
ibarland

homeinfolecturesexamsarchive

lect09c
X-Expr revisited; an application of dynamic scope

Remainder of semester:

Today (as a review/preview of interpreting), we'll revisit and exand code which processes (xml) trees:

 1  #lang scheme
 2  
 3  ;;;; This file handles xml in scheme.
 4  ;;;; It differs from xnode.ss in three important ways:
 5  ;;;; - our data-definition allows attributes in xml tags;
 6  ;;;; - we don't use structs -- just lists (of lists of ...)
 7  ;;;; - we write some functions which process xml trees.
 8  
 9  
10  ; An xnode is:
11  ;  - an string, or
12  ;  - a xtag
13  
14  ; An xtag is:
15  ; (list symbol (list-of attr+val) xnode...)
16  ;                                        
17  ; Note that the '...' is shorthand for 0-or-more; we really mean:
18  ; (cons [symbol] (cons (list-of attr+val) (list-of xnode)))
19  
20  ; An attr+val is:
21  ; (list string string)
22  
23  
24  
25  ;; Examples of the data:
26  ;; xnode:
27  (define x1 "hello there")
28  (define x2 '(em {} "wowy zowy"))
29  (define x3 '(p {} "hello" (em {} "wowy zowy")))
30  (define x3 '(p {["align" "center"] ["style" "footnote"]}
31                 "hello"
32                 (em {} "wowy zowy")))
33  
34  ;; Here is the result of parsing a string:
35  "<p align="center" style="footnote"><em>hi</em> to all the <b>very <b>very <b><b>very</b></b></b></b></p>"
36  
37  ;;; TODO IN CLASS
38  
39  
40  (define xtag-tag first)
41  (define xtag-attrs second)
42  (define (xtag-contents x) (rest (rest x)))
43  (define (xtag? x) (and (symbol? (xtag-tag x))
44                         (attrs? (xtag-attrs x))
45                         (xlist? (xtag-contents x))))
46  (define (attr+val? a+v) (and (list? a+v)
47                               (= 2 (length a+v))
48                               (string? (first a+v))
49                               (string? (second a+v))))
50  (define (attrs? a+vs) ... )
51  (define (xlist? xx) ... )
52  
53  
54  ;; We won't actually call 'make-xtag' (since
55  ;; we'll just make the lists manually),
56  ;; but there's no reason why we couldn't:
57  ;;
58  (define (make-xtag tag attrs contents)
59    (cons tag (cons attrs contents)))
60  
61  
62  (define (xnode->string x)
63    (cond [(string? x) x]
64          [(xtag? x) (string-append "<" (symbol->string (xtag-tag x)) ">"
65                                    (foldl (lambda (f rr) (string-append (xnode->string f) rr)) "" (xtag-contents x))
66                                    "</" (symbol->string (xtag-tag x)) ">")]))
67  
68  
69  
70  ; Example handlers
71  
72  ;; (-> xtag xtag)
73  ;; Transform an "em" tag into one
74  ;; which is "i" *and* font w/ color "blue"
75  (define (handle-em x)
76    ...)
77  
78    
79  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80  ;;;  Code to *process* an xml tree.
81  ;;;  We'll pass in a association-list [java.util.ListMap] 
82  ;;;  of (tag-name + (-> xnode xnode)).
83  
84  (define (process xnode processors)
85    (cond [(string? xnode) xnode]
86          [(xtag? xnode)  ...]))
87    
.

Then, we'll implement a more general tree-processor, which passes in its own environments, in a way which could also be used to implement dynamic scope.
(Though since we are processing only xml -- recursive data -- in a structural way, it still 'feels' similar to static scope.)

homeinfolecturesexamsarchive


©2008, Ian Barland, Radford University
Last modified 2008.Oct.31 (Fri)
Please mail any suggestions
(incl. typos, broken links)
to iba�rlandrad�ford.edu
Powered by PLT Scheme