[MLton] Callback to function pointer?
Matthew Fluet
fluet@cs.cornell.edu
Fri, 15 Jul 2005 18:10:45 -0400 (EDT)
> _import *: ptrTy -> cfTy; ptrTy -> cfTy
>
> So I think it makes sense to
> stick with _import * (which, by the way Matthew must have slipped the
> currying by me in my sleep :-).
I think the currying is very useful here, because the common scenario is
what appears in examples/ff/iimport.sml:
local
val double_to_double =
_import * : DynLink.fptr -> real -> real;
val sin_fptr = DynLink.dlsym (hndl, "sin")
val cos_fptr = DynLink.dlsym (hndl, "cos")
val tan_fptr = DynLink.dlsym (hndl, "tan")
in
val sin = double_to_double sin_fptr
val cos = double_to_double cos_fptr
val tan = double_to_double tan_fptr
end
> Stephen proposed:
>
> _symbol "symbol": cbTy; (unit -> cbTy) * (cbTy -> unit)
> _symbol *: ptrTy, cbTy; (ptrTy -> cbTy) * (ptrTy * cbTy -> unit)
My vote is for this proposal.
> o is not backward compatible
> o introduces a new keyword
It is an advanced, unsafe feature, so I think some breakage is o.k.
Likewise, at most it breaks _import "symbol": cbTy; and the undocumented
_import # "symbol" : ptrTy;
> o does not use currying
Sigh. But, I don't think it saves much in this scenario, since the common
case would be:
local
val (get_double, set_double) =
_symbol * : real;
val epsilon_ptr = DynLink.dlsym (hndl, "epsilon")
in
val get_epsilon = fn () => get_double epsilon_ptr
val set_epsilon = fn e => set_double (epsilon_ptr, e)
end
> One thing I don't like about any of the proposals is having to write
> the pointer type, since it is almost always MLton.Pointer.t.
I disagree. DynLib would like to use an opaque DynLib.fptr.