I think there's at least once scenario where eval-in-a-macro is not a mistake, mainly when you want to generate some code that depends on 1) some passed in expression and 2) something which can only be known at runtime. Here's my example:
The macro (@self) which I'm writing takes a type name and a function definition, and gives the function a "self" argument of that type and rewrites all occurrences of the type's fields, X, to self.X. Effectively it takes this: type MyType x end @self MyType function inc() x += 1 end and spits out: function inc(self::MyType) self.x += 1 end (if this sounds familiar, its because I've discussed it here before, which spun off this <https://github.com/fcard/SelfFunctions.jl>, that I'm currently working on tweaking) To do this my code needs to modify the function expression, but this modification depends on fieldnames(MyType), which can *only* be known at runtime. Hence what I'm doing is, macro self(typ,func) function modify_func(fieldnames) # in here I have access to `func` expression *and* `fieldnames(typ)` as evaluated at runtime # return modified func expression end quote $(esc(:eval))($modify_func(fieldnames($(esc(typ))))) end end I don't see a cleaner way of doing this, but I'm happy to take suggestions. (Btw: my original question was w.r.t. that last "eval', which makes it so that currently this doesn't work on function closures. I'm still processing the several suggestions in this context...) On Tuesday, September 27, 2016 at 5:12:44 PM UTC+2, Steven G. Johnson wrote: > > On Tuesday, September 27, 2016 at 10:27:59 AM UTC-4, Stefan Karpinski > wrote: >> >> But note that if you want some piece of f to be "pasted" from the user >> and have access to certain parts of the local state of f, it's probably a >> much better design to let the user pass in a function which f calls, >> passing the function the state that it should have access to: >> > > Right; using "eval" in a function is almost always a mistake, an > indication that you should really be using a higher-order function. > <https://en.wikipedia.org/wiki/Higher-order_function> >