On Thu, Apr 7, 2016 at 8:55 AM, Andreas Lobinger <[email protected]> wrote:
> Hello colleague,
>
> i'm not an expert on macros, but if you try to learn correct macroexpansion
> you should use a different target than ccall. ccall looks like a regular
> function call but has special handling (you could see this in lowered code)
> and that's the reason the arguments are expected to be constants. In my own
> examples to build ccalls from paramters i build the expressions manually and
> eval-ed.
>
>

Also note that you are missing a number of interpolations, the
following should work

:(ccall($f, Int, $(Expr(:tuple, [Int for i in 1:length(args)]...)), $(args...)))

> On Thursday, April 7, 2016 at 1:29:06 PM UTC+2, Laurent Bartholdi wrote:
>>
>> Hi,
>> I'm trying to understand macro expansion, and am a bit stuck. I would
>> like, in distilled form, to have a macro "@do_ccall" which calls its
>> argument with Int type. Thus I would like
>>
>> julia> macroexpand(:(@do_ccall(f,1,2,3)))
>> :(ccall(f,Int,(Int64,Int64,Int64),args...))
>>
>> and I programmed it as
>> julia> macro do_ccall(f,args...)
>> :(ccall(f,Int,$(ntuple(i->Int,length(args))),args...)) end
>> @do_ccall (macro with 1 method)
>>
>> Now the tuple argument just doesn't seem to get interpreted properly:
>>
>> julia> @do_ccall(C_NULL,1,2,3)
>> ERROR: syntax: ccall argument types must be a tuple; try "(T,)"
>>  in eval(::Module, ::Any) at ./boot.jl:237
>>
>> (note: calling the routine at C_NULL would have crashed Julia; it's just
>> for demonstration purposes)
>>
>> Thanks in advance! Laurent

Reply via email to