(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つを弄ってなんとか、といった感じ。
素晴らしいものを作ってくださったお二方に感謝します。
この後はやっぱり、自分でSchemeのJavaScript実装したりかなーみたいな。
それと、上のsxml->xmlは静的なS式を変形するだけなので、もうちょっと動的に動くようにしたいと思います。