(def! tag (fn* (name content) (str "<" name ">" (apply str content) "</" name ">")))
(defmacro! mktags (fn* (& names) (map (fn* (name) `(def! ~(symbol name) (fn* (& content) (tag ~name content)))) names)))
(mktags "html" "head" "title" "body" "h1" "p" "ul" "li")
(print
(html
(head (title "Hello world!"))
(body
(h1 "Hello" "world!")
(p "Writing from inside mal (lisp) seems to work, yeah?")
(apply ul (map li '("one" "two" "three")))
)
))
Turns out that I don't need join
or reduce
, since apply str
does the same thing. Neat.
Also, I'm still not sure what I'm going to do about attributes. I want to be able to do something like (html {"lang" "en-gb"} ...)
, with the hash argument being optional, but I need to work out how to do that. (and clearly, two versions of tag
, and an if
in the macro to pick the right one, but I'm still not wild about it).