[MLton-user] FFI and finalizable values
Vesa A Norrman
vnorrman@cc.hut.fi
Tue, 16 Dec 2003 16:10:12 +0200 (EET)
> I think that it's easy enough to do in the language by writing a
> wrapper around c_function at the time it is defined, so that you only
> have to use the awkward syntax once per _import.
I agree the change in code size occurs once per each import.
> val c_function = _import "c_function" : Pointer.t -> unit;
> val c_function: Pointer.t Finalizable.t -> unit =
> fn x => withValue (x, c_function)
This is about what I do.
> You can also add helper functions for the more complex cases
>
> val withValue2: 'a Finalizable.t * 'b Finalizable.t * ('a * 'b -> 'c) -> 'c =
> fn (x, y, f) => withValue (x, fn x => withValue (y, fn y => f (x, y)))
>
> Or, we might add these to MLton.Finalizable. In any case, with these,
> it is easy enough to define a wrapper for your other case.
>
> val c_function = _import "c_function" : Pointer.t * Pointer.t -> unit;
> val c_function: Pointer.t Finalizable.t * Pointer.t Finalizable.t -> unit =
> fn (x, y) => withValue2 (x, y, c_function)
In my program nested use of withValue occurs in a situation where
types are coming behind :>. In that case each type needs its own
withValue, therefore I would not find withValue2 usefull.
I was also looking to eliminate a function giving
access to withValue, since FFI can look through :>.
> Hopefully that works well enough, especially since it's all done once
> per _import.
FFI sure works well enough. I was trying to simplify...
Vesa