[MLton-user] Calling C functions with a variable number of
arguments
Phil Clayton
phil.clayton at lineone.net
Tue Aug 31 06:21:08 PDT 2010
Thanks for the link - I read with great interest. I would like to
explore NLFFI further but in the short term I am tied to using MLton's
_import directly.
To get a feel what direction I should be heading in, it would be useful
to known whether there are any plans afoot to support varargs for
_import - just variability up to compile-time, not at run-time.
The capability appears almost there in MLton: we can already write e.g.
val fa = _import "f" : t -> unit;
val fb = _import "f" : t * b2 -> unit;
val fc = _import "f" : t * c2 * c1 -> unit;
i.e. any number of different calling signatures to the C function f and
use fa, fb, fc, etc. as required.
In order to provide general purpose libraries that don't tie down the
number of arguments (until compile-time), it would be nice to be able to
write e.g.
val f = _import "f" : t -> ... -> unit;
and just use f, letting type inference fill in the types of the missing
curried arguments. That could be awkward as '...' can't be represented
by a type variable, so perhaps e.g.
val f = _import "f" : t -> 'a -> unit;
where 'a must be a nested tuple, e.g. bool * (real * (int * unit)).
With an eye to constructing type safe interfaces (as described in John
et al.'s paper, section 3), it is is worth noting that it is easy to
convert such a function on nested pairs to have curried arguments:
fun curry f x y = f (x, y)
fun na x = x (* no arg *)
fun va f g = f o curry g (* var arg *)
fun va_call spec = spec (fn f => f ())
Then we have
va_call na; (* (unit -> 'a) -> 'a *)
va_call va; (* ('b * unit -> 'a) -> 'b -> 'a *)
va_call (va o va);
(* ('c * ('b * unit) -> 'a) -> 'c -> 'b -> 'a *)
va_call (va o va o va);
(* ... *)
etc.
(Here the last argument has type unit as there could be no arguments.)
Phil
John Reppy wrote:
> We support varargs in SML/NJ using a technique described in a 2008 ML Workshop
> paper. A key feature of our approach is that it should be possible to use our
> implementation in any ML system that supports C calls. You can find a copy of
> the paper at
>
> http://people.cs.uchicago.edu/~jhr/papers/2008/ml-varargs.pdf
>
> On Jul 26, 2010, at 2:00 PM, mlton-user-request at mlton.org wrote:
>> Hi,
>>
>> I have been using the FFI and have found it very flexible but have
>> run
>> into a problem that I can't see how to solve. I am trying to call a
>> C
>> function with a variable number of arguments but need the variability
>> in
>> the number of arguments available in SML too.
>>
>> The attached examples show that there is no problem importing a C
>> function with a variable argument list for a fixed number of
>> arguments:
>> the files 'call_sum_<N>.sml' import the C function 'sum' with N
>> arguments for the variable argument list. I need to do something like
>>
>> val sum = _import "sum" : int * int list -> int;
>>
>> (I am happy for the variable arguments to have the same type in SML.)
>> Does anyone have any ideas about how to achieve a similar effect?
>>
>> Thanks,
>> Phil
>
>
More information about the MLton-user
mailing list