[ocaml-ctypes] Build help

Jeremy Yallop yallop at gmail.com
Tue Aug 16 07:28:29 BST 2016

On 15 August 2016 at 21:41, Andre Nathan <andre at digirati.com.br> wrote:
> On 08/15/2016 08:34 AM, Jeremy Yallop wrote:
>> you'd write something like this:
>>    module Foreign_bindings(F: Cstubs.FOREIGN) = struct
>>      open F
>>      let mysql_library_init = foreign "mysql_server_init"
>>        (int @-> ptr_opt (ptr char) @-> ptr_opt (ptr char) @-> returning int)
>> In this second snippet 'foreign' refers to 'F.foreign', not 'Foreign.foreign'.
> In this case a binding that had type "a -> b" now became
>   (a -> b F.return) F.result
> For example, this binding:
>   let mysql_init = foreign "mysql_init"
>     (T.mysql_opt @-> returning T.mysql_opt)
> had type "T.mysql_opt -> T.mysql_opt" but after the change it became
>   (T.mysql_opt -> T.mysql_opt F.return) F.result
> This way I can't use it as a function anymore. Is this expected?

It's expected, but it's not the problem that it initially appears to be.

*Inside* the functor the binding has non-function type: it's not
available for calling at that point, since it hasn't yet been linked
together with the generated code.

*Outside* the functor, once you've applied the functor to the module
that ctypes generates, the function becomes available for calling.

For example, here's the bindings functor from the unix-dirent package,
which binds opendir, readdir, etc.:


(Note that the functor contains only bindings for functions, not calls
to those bindings.)

And here's the line of code that links together the bindings functor
with the generated module:


A little further down, the code makes calls to the bindings:


Kind regards,


More information about the Ctypes mailing list