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
