You'll need to decision off of whether or not the second argument to your macro is a doc-string (you can test if it's a string). Clojure macros are Clojure, so you can perform any logic or manipulations on the forms passed to the macro that you want to. This should be close to if not exactly what you're after:
(defmacro defhtml [name & args]
(cond
;; doc-string?
(string? (first args))
(let [[doc-string args-list & body] args]
`(defn ~name ~doc-string ~args-list (html ~@body)))
:no-doc-string
(let [[args-list & body] args]
`(defn ~name ~(format "HTML Generator %s" name) ~args-list (html ~@body)))))
That should produce the macro expansions you're after:
(defhtml include-css [href]
[:link {:href href :rel "stylesheet"}])
produces:
(defn include-css
"HTML Generator include-css"
[href]
(html [:link {:href href, :rel "stylesheet"}]))
while:
(defhtml include-css
"Standard css includes fory my site"
[href]
[:link {:href href :rel "stylesheet"}])
produces:
(defn include-css
"Standard css includes fory my site"
[href]
(html [:link {:href href, :rel "stylesheet"}]))