diff options
-rw-r--r-- | src/clj/clojure/core.clj | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index 5c012155..8d3eef21 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -3031,14 +3031,13 @@ (defmacro definline "Experimental - like defmacro, except defines a named function whose body is the expansion, calls to which may be expanded inline as if - it were a macro. Cannot be used with variadic (&) args." + it were a macro. Cannot be used with variadic (&) args." [name & decl] - (let [[args expr] (drop-while (comp not vector?) decl) - inline (eval (list `fn args expr))] + (let [[pre-args [args expr]] (split-with (comp not vector?) decl)] `(do - (defn ~name ~args ~(apply inline args)) - (let [v# (var ~name)] - (.setMeta v# (assoc ^v# :inline ~inline)))))) + (defn ~name ~@pre-args ~args ~(apply (eval (list `fn args expr)) args)) + (alter-meta! (var ~name) assoc :inline (fn ~args ~expr)) + (var ~name)))) (defn empty "Returns an empty collection of the same category as coll, or nil" |