(define (closing? tag) (not (member tag html-void-elements))) (define html-void-elements '(area base br col command embed hr img input keygen link meta param source track wbr)) (define (print-attr attr) (let ((key (car attr)) (value (cadr attr))) (display " ") (display key) (display "=\"") (display value) (display "\""))) (define (alist->html alist) (cond ((null? alist) (display "")) ((eq? '% (caar alist)) (for-each print-attr (cdar alist))) (else (display "error")))) (define (content->html content) (if (null? content) (display "") (->html content))) (define (what-is x) (cond ((symbol? x) 'tag) ((string? x) 'content) ((eq? '% (car x)) 'alist) (else 'content))) (define (content? x) (eq? 'content (what-is x))) (define (alist? x) (eq? 'alist (what-is x))) (define (element->html element) (let ((tag (car element)) (alist (filter alist? element)) (content (filter content? element))) (display #\<) (display tag) (alist->html alist) (display #\>) (content->html content) (if (closing? tag) (begin (display #\<) (display #\/) (display tag) (display #\>)) (display "")))) (define (->html tree) (cond ((list? tree) (for-each (lambda (t) (if (not (string? t)) (element->html t) (content->html t))) tree)) ((string? tree) (display tree)) ((null? tree) (display "")) (else (display "error"))))