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
>>
>>
>>
>>

Reply via email to