You could remove the type assertion on `fn`, and then pull the symbol out with `fn.args[1]` if it is an expression. I don't see much benefit to setting things up this way, though.
On Wed, Mar 25, 2015 at 8:58 PM, Phil Tomson <[email protected]> wrote: > I want to be able to pass in a symbol which represents a function name > into a macro and then have that function applied to an expression, > something like: > > @apply_func :abs (x - y) > > (where (x-y) could stand in for some expression or a single number) > > I did a bit of searching here and came up with the following (posted by > Tim Holy last year, from this post: > https://groups.google.com/forum/#!searchin/julia-users/macro$20symbol/julia-users/lrtnyACdrxQ/5wovJmrUs0MJ > ): > > macro apply_func(fn::Symbol, ex::Expr) > qex = Expr(:quote, ex) > quote > $(esc(fn))($qex) > end > end > > I've got a Symbol which represents a function name and I'd like to apply > to the expression, so I'd like to be able to do: > x = 10 > y = 11 > @apply_func :abs (x - y) > ...And get: 1 > > But first of all, a symbol doesn't work there: > julia> macroexpand(:(@apply_func :abs 1)) > :($(Expr(:error, TypeError(:anonymous,"typeassert",Symbol,:(:abs))))) > > I think this is because the arguments to the macro are already being > passed in as a symbol... so it becomes ::abs > > Ok, so what if I go with: > > ulia> macroexpand(:(@apply_func abs 1+2)) > quote # none, line 4: > abs($(Expr(:copyast, :(:(1 + 2))))) > end > > ...that seems problematic because we're passing an Expr to the abs then: > > julia> @apply_func abs 1+2 > ERROR: `abs` has no method matching abs(::Expr) > > Ok, so now I'm realizing that macro isn't going to do what I want it to, > so let's change it: > > macro apply_func(fn::Symbol, ex::Expr) > quote > $(esc(fn))($ex) > end > end > > That works better: > julia> @apply_func abs 1+2 > 3 > > But It won't work if I pass in a symbol: > julia> macroexpand(:(@apply_func :abs 1+2)) > :($(Expr(:error, TypeError(:anonymous,"typeassert",Symbol,:(:abs))))) > > How would I go about getting that case to work? > > Phil > > > >
