If this is enough that you want to replace the (set) of basic macros, you can try this approach:
(ns huge.core
(:refer-clojure :exclude [defn]))
(defmacro defn [name & defn-tail]
(assert (nil? (resolve name))
(str "Attempting to redefine already defined Var "
"#'" (.name *ns*) "/" name))
`(clojure.core/defn ~name ~@defn-tail))
Then, any attempt to redefine the existing Var with defnwill fail:
user=> (defn foo [] :foo)
user=> (defn foo [] :bar)
AssertionError Assert failed: Attempting to redefine already defined Var
(nil? (resolve name)) user/defn (NO_SOURCE_FILE:2)
defmacro; clojure.core/defmacro .
, def , Vars. , defvar ( clojure.contrib.def) .