Thanks, Cedric: I suspected that convenience was a primary motivation (and maybe analogy with `defn', etc.); and I realized that macros can be more efficient than their equivalent function.
It hadn't occurred to me, though, that a shallow stack might come into play; or {un,}boxing, of all things. Quoth Cedric Greevey on Sweetmorn, the 64th of The Aftermath: > On Thu, Dec 22, 2011 at 4:54 PM, Peter Danenberg <p...@roxygen.org> wrote: > > Scheme, for instance, obeys the Law of Macro-Parsimony: "don't use > > defmacro," namely, "where defn will suffice;" Clojure, on the other > > hand, is macro-liberal. > > > > In other words, everyone seems to prefer e.g. `(defmacro foo [vars & > > body] `(do ... ~@body))' where `(defn foo [vars thunk] ... (thunk))' would > > suffice; cases in point: > > > > with-bindings > > with-bindings* > > with-in-str > > with-local-vars > > with-open > > with-out-str > > with-precision > > with-redefs > > > > Why? > > Syntax convenience. Less need for #(...) lambdas cluttering the code. > Particularly helpful when nested, since the #(...) lambda syntax > doesn't nest and you'd start needing (fn [x y] ...)s as well. > > Also, if the macro isn't implemented with a thunk passed to a helper > function under the hood, the macro saves a couple of stack frames, and > on the JVM stack can run out relatively easily. With chained lazy > functions (e.g. (map (filter (map (... (partition 3 some-seq)))))) and > recursion this becomes even more significant. > > Lastly, in some cases avoiding function calls may save having to box > and unbox primitives, though less so with 1.3 than with previous > versions of Clojure. > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en