htmlの変換

を見ておもしろそうだったので、やってみました><。

していること

S式で表したhtmlを実際のhtmlに変換して出力する。

S式で表したhtml

(define gauche-page  
  '(html (head (title "Gauche Web"))
         (body (h1 "Gauche Web Page")
                (table (tr (td 1) (td "lisp"))
                        (tr (td 2) (td "scheme"))))))

コード

(use text.tree)
;; (define open-tag (lambda (s) (list "<" s ">")))
;; (write-tree (open-tag "tr")) ;; -> <tr>

(define (html->tree e)
  (let ((open-tag (lambda (s) (list "<" s ">")))
        (close-tag (lambda (s) (list "</" s ">"))))
    (define (parse-html e)
      (cond ((null? e)  '())
            ((list? e)
             (let1 tag (car e)
               (list (open-tag tag) 
                     (map parse-html (cdr e))
                     (close-tag tag))))
            (else e)))
    (parse-html e)))

(write-tree (html->tree gauche-page))

元の記事では、直接表示してましたが、一度木を作成してからwrite-treeで出力してます。