[Libguestfs] [nbdkit PATCH 2/2] ocaml: Implement .list_exports and friends

Richard W.M. Jones rjones at redhat.com
Tue Sep 1 14:45:38 UTC 2020


On Tue, Sep 01, 2020 at 09:27:39AM -0500, Eric Blake wrote:
> I guess my remaining questions are whether there is a better approach than:
> 
> func : export list =
>   [ { "name1"; None }; { "name2"; Some "desc" } ]
> 
> In python, I was able to use:
> 
>   return [ "name1", ( "name2", "desc" ) ]
> 
> where the alternation was on a string vs. a 2-tuple of strings,
> rather than all list members being a record but where the record had
> an optional member.  But I'm not sure how to represent that in the
> ocaml interface.  Maybe I'm thinking of something like:
> 
> type export =
>   | Name of string
>   | NameDesc of string * string
> 
> but I'm not quite sure how to write a list that initializes that.
> On the other hand, I think I understand the C binding for such a
> type: either val is Val_int(0) (C 1) for the Name branch (Field(v,
> 0) is a string), or val is Val_int(1) (C 2) for the NameDesc branch
> (Field(v, 0) is name, Field(v, 1) is desc).

Using optional fields in a struct (your original implementation) is
fine and perfectly natural.

If you really wanted to use the Name/NameDesc version then you'd write
that in OCaml as:

  [ Name "name1"; NameDesc ("name2", "desc") ]

and on the C side each element of the list would be a block with tags
0 (Name) or 1 (NameDesc), and 1 or 2 fields respectively.

The way constructors are stored is complicated and optimized for fast
access rather than ease of unpacking for C programmers.  If you really
want the details it's at the bottom of:

https://rwmj.wordpress.com/2009/08/05/ocaml-internals-part-2-strings-and-other-types/

or in the official manual here:

https://caml.inria.fr/pub/docs/manual-ocaml/intfc.html#ss:c-concrete-datatypes

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list