Open2
Dice of DomeをClojureで
経緯
Clojureを学ぶにあたって、実際に動くものを作りたい。
そこで、我らが聖典Land of Lispから、Dice of DomeをClojureに移植する形で作ってみようかと思った。
偉大なる聖典
SVGを作成するところから
本書の順番とは異なるが、まず手をつけられそうなところからやる。
SVGを作りたいので、先にこちらから手を付ける試み。
ログを取るのは途中から思いついたので、svgマクロまでは結果だけのコードを示す。
(defmacro tag [name atts & body]
`(do
(print-tag '~name
(map (fn [[k# v#]]
[(name k#) v#])
(partition 2 ~atts))
nil)
(print ~@body)
(print-tag ~name nil true)))
(defmacro html [& body]
`(tag "html" []
~@body))
(defmacro body [& body]
`(tag "body" []
~@body))
(html
(body
"Hello, HTML!"))
; <html><body>Hello, HTML!</body></html>
(defmacro svg [width height & body]
`(tag "svg"
[:xmlns "http://www.w3.org/2000/svg"
:xmlns:xlink "http://www.w3.org/1999/xlink"
:height ~height
:width ~width]
~@body))
(macroexpand-1 '(svg 100 100 "svg body"))
(svg 100 100 "svg body")
; <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="100" width="100">svg body</svg>