Dicas de tipo devem ser adicionadas aos símbolos. Veja como fazer isso para o tipo de retorno da função:
(defmacro defthreadlocal [name & body]
`(def ~(with-meta name {:tag ThreadLocal})
(proxy [ThreadLocal] []
(initialValue []
~@body))))
E aqui está como fazer isso para args:
(defmacro declare-first-char []
(let [s (gensym)]
`(defn first-char [~(with-meta s {:tag String})]
(.charAt ~s 0))))