(XML)HTML駆逐

取りあえずソースだけ

<!-- これがHTMLファイルの中に書かれています -->
<p id=out></p>

<script type="application/jscheme">
(define (sxml->xml sxml)
  (define (make-attr l ac)
    (if (null? l) ac
        (make-attr
         (cdr l) (string-append ac " " (symbol->string (caar l))
                                "=\"" (cadar l) "\""))))
  (define (make-xml x bef aft)
    (cond ((string? x) (append bef (list x) aft))
          ((and (pair? x) (symbol? (car x)))
           (let ((tag (symbol->string (car x))))
             (if (and (not   (null? (cdr x)))
                      (pair? (cadr x))
                      (eq? (caadr  x) '@))
                 (make-xml (cddr x)
                           (append bef (list 'BO tag (make-attr (cdadr x) "") 'BC))
                           (append     (list 'EO tag 'EC) aft))
                 (make-xml (cdr x)
                           (append bef (list 'BO tag 'BC))
                           (append     (list 'EO tag 'EC) aft)))))
          ((pair? x) (make-xml ()
                               (make-xml (car x) bef ())
                               (make-xml (cdr x) () aft)))
          (else (append bef aft))))
  ;; main
  (make-xml sxml () ()))
;; utility
(define (cat-normal l s)
  (cond ((null? l) s)
        ((string? (car l))
         (cat-normal (cdr l) (string-append s (car l))))
        (else (cat-normal (cdr l)
                          (string-append s (case (car l)
                                             ((BO)    "<")
                                             ((EO)    "</")
                                             ((BC EC) ">")))))))

(define data
  `("<!DOCTYPE etc...>"
    (html
     (head (title "sxml"))
     (body
      (@ (bgcolor "blue")
         (text    "white"))
      (center (b "Hello."))))))


(cat-normal (sxml->xml data) "")

;(define (fib n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))
;(fib 20)
</script>

<script type="text/javascript" src="objectdump.js"></script>
<script type="text/javascript" src="library.js"></script>
<script type="text/javascript" src="webscheme.js"></script>

これで青色のページの中に白いHelloという文字が表れて見えます。

sxml->xmlに関しては、Schemeまともに書けないので、ここに書いてくださっているものを使わせてもらいました。
http://homepage1.nifty.com/blankspace/scheme/nsx.html


そして元になっているScheme on JavaScript
http://www.yuasa.kuis.kyoto-u.ac.jp/~yhara/webscheme/
yharaさんのwebschemeです。


昼ごろから色々とこの2つを弄ってなんとか、といった感じ。
素晴らしいものを作ってくださったお二方に感謝します。


この後はやっぱり、自分でSchemeJavaScript実装したりかなーみたいな。


それと、上のsxml->xmlは静的なS式を変形するだけなので、もうちょっと動的に動くようにしたいと思います。