caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Q: external data in Ocaml 1.03
@ 1996-12-19 15:40 Basile STARYNKEVITCH
  0 siblings, 0 replies; only message in thread
From: Basile STARYNKEVITCH @ 1996-12-19 15:40 UTC (permalink / raw)
  To: caml-list

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2446 bytes --]


On some occasions, it would be useful to have external (foreign) data
in Ocaml.

I'll take a specific example: a small X11 Xlib encapsulation.

The ocaml 1.03 manual says (§13.2) that "a pointer to an object
outside the heap (eg a pointer to a block allocated by malloc, or to a
C variable)" is a valide object of type value.

So X11 Display* pointers (which are malloc-ed by the Xlib) are valid
ocaml objects. In particular, I suppose that the null (Display*)0 is a
valid ocaml object. But I don't know how to get it!


In Ocaml I'll code naturally:

 type x11_display_t;; (*opaque type for Display* Xlib pointer *)

 external x11_nulldisplay: x11_display_t = "caml_x11_nulldisplay";;

This does compile with Ocamlopt 1.03. Of course, the compiled code
contains a call to the C routine caml_x11_nulldisplay which is not
what I expect.

While in C I want to code:

 const Display* caml_x11_nulldisplay=(Display*)0;;
 
This doesn't work as expected.

Of course, purist will rightly say that the null pointer is not a
valid C pointer! But I might also code (a useless but valid example)
in Caml

type c_file_t;; (*opaque type for FILE* stdio pointer*)

external c_stdout: c_file_t = "caml_stdout";;

with the C code

  const FILE* caml_stdout=stdout;

Actually I think that the runtime might have a routine that converts a
C pointer (possibly Null) to None when it is 0 and to Some ptr when it
is a valid ptr.



My question is: how do I get external constant in Caml? I think that
the only hacky way is to define a C routine returning this constant:

in Caml:

external x11_get_null_display : unit -> x11_display_t 
 = "caml_get_x11_nulldisplay";;

val x11_nulldisplay = x11_get_null_display () ;;

in C

const Display*caml_get_x11_newdisplay(void)
{
  return (Display*)0;
}

Thanks for reading
-- 


N.B. Any opinions expressed here are solely mine, and not of my organization.
N.B. Les opinions exprimees ici me sont personnelles et n engagent pas le CEA.


----------------------------------------------------------------------
Basile STARYNKEVITCH   ----  Commissariat à l Energie Atomique 
DRN/DMT/SERMA * CEA/Saclay bat.470 * 91191 GIF/YVETTE CEDEX * France
fax: (33) 01,69.08.85.68; phone: 01,69.08.40.66; home: 01,46.65.45.53
email: Basile . Starynkevitch @ cea . fr  (but remove white space)
I speak french, english, russian. Je parle français, anglais, russe.
----------------------------------------------------------------------






^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~1996-12-20 10:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1996-12-19 15:40 Q: external data in Ocaml 1.03 Basile STARYNKEVITCH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).