Open2

Dice of DomeをClojureで

kip2kip2

経緯

Clojureを学ぶにあたって、実際に動くものを作りたい。
そこで、我らが聖典Land of Lispから、Dice of DomeをClojureに移植する形で作ってみようかと思った。

偉大なる聖典
https://www.oreilly.co.jp/books/9784873115870/

kip2kip2

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>