On Apr 7, 2016 4:44 PM, "Laurent Bartholdi" <[email protected]> wrote: > > Sorry, I still don't get it entirely. The code now looks like this (in simplified form) with a callable object Obj defined in the module: > > macro CALL_VARARG(obj,args...) > quote > f = handler_function($(esc(obj))) > ccall(f,Obj,$(Expr(:tuple,[Obj for arg in 1:nargs]...)),$([esc(arg) for arg in args]...)) > end > end > > (obj::Obj)(args...) = @CALL_nARGS(obj,map(Obj,args)...) > > and given x a function object taking one argument and xx a function object taking 2 arguments, and y an object, > > julia> GAP.@CALL_nARGS(x,y) # all fine > <obj 1> > > julia> x(y) # same answer > <obj 1> > > julia> GAP.@CALL_nARGS(xx,y,y) # all fine > <obj 2> > > julia> xx(y,y) # oops! > ERROR: MethodError: no method matching cconvert(::Type{GAP.Obj}, ::GAP.Obj, ::GAP.Obj) > > So the splicing $(args...) you wrote is necessary for pass the correct arguments to ccall, but the cconvert method gets applied to "args..." and not individually to all elements of args. > > Strangely enough, cconvert is not documented in Julia (?cconvert returns nothing) even though it's on the online docs; and no method seems available (methods(cconvert) returns nothing).
Splatting and vararg are not allowed in ccall. > > Thanks in advance! Laurent
