            (not (symbol? x)))
       (quoted? x)))
 
+(derive clojure.lang.IPersistentList ::form)
+(derive clojure.lang.Symbol ::form)
+
+(defmulti compile-html
+  "Render a Clojure data structure to a seq of HTML at compile-time when
+  possible, at runtime when not."
+  type)
+
 (defn- collapse-strs
   "Concatenate adjacent strings in a sequence."
   [coll]

(defmacro html
  "Efficiently render a Clojure data structure into a seq of HTML."
  [& content]
  (wrap-list (build-list (mapcat compile-html content))))

    '()
    (reverse coll)))

(defn compile-seq
  "Compile a sequence of Clojure data structures into HTML"
  [coll]
  (let [forms (collapse-strs (mapcat compile-html coll))]
    (if (every? literal? forms)
      `(list ~@forms)
      `(concat ~@(for [form forms]
                   (if (literal? form)
                     `(list ~form)
                     form))))))

(defn compile-tag
  "Attempt to pre-render a HTML tag."
  [tag-name content]
  (if (literal? tag-name)
    (render-tag tag-name content)
   `(render-tag ~tag-name ~(compile-seq content))))

(defn compile-attrs
  "Attempt to pre-render an attribute map."
  [attrs content]
  (if (map? attrs)
    (render-attrs attrs content)
    (if-not (literal? attrs)
     `((render-attrs ~attrs ~(compile-seq content)))
      content)))

(defn compile-content
  "Attempt to pre-render the contents of a tag."
  [content]
  (cons
    ">"
    (cond
      (map? (first content))
        (mapcat compile-html (rest content))
      (literal? (first content))
        (mapcat compile-html content)
      :else
        (list "blah"))))

(defmethod compile-html ::vector
  [[tag & content]]
