To be clear, $(map(esc, args)...)
works everywhere I've tried it _except_ in function definition argument lists. On Monday, October 19, 2015 at 11:17:49 AM UTC-4, Cedric St-Jean wrote: > > Hi Andrei, > > On Monday, October 19, 2015 at 3:45:14 AM UTC-4, Andrei Zh wrote: >> >> I'm trying to write a macro for generation of new functions given their >> name and arguments, e.g. given macro call: >> >> @deffun foo(a, b) >> >> Coming from Common Lisp, I tried writing similar macros but failed to > make them work. I've found that > > @some_macro function foo(a, b) > > works a lot better. It's more verbose, but it composes better with other > macros (kinda like Python decorators...) I use > > @capture(fun_def, begin function fname_(args__) body__ end end) > esc(:(function $(fname)($(args...)) > ...) > > > where @capture comes from macrotools.jl > > > >> >> Important part is that both - name of a function and name of arguments - >> should be preserved. My best attempt to do it looks like this: >> >> function $(esc(func))($(esc(args...))) >> > > esc isn't magical, just `@show esc(:a)` to see what it does. You can write > the arguments as > > ($(map(esc, args)...)) > > and that _should_work, but last time I tried it doesn't because of a bug > where Julia doesn't check properly for escaping in argument lists. > > >> `$(esc(func))` works pretty well, but `args` isn't a Symbol and so macro >> compilation fails. >> >> 1. How do I escape list of arguments here? >> 2. How do I make this macro to also support argument types? E.g. given >> macro call: >> >> >> @deffun foo(a::Int, b::Float64) >> >> the following functions should be generated: >> >> function foo(a::Int, b::Float64) >> # do some stuff >> >> >> end >> >> >> >>
