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 <[email protected]> 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 [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en