Again: FFI syntax

Sven Panne Sven.Panne at informatik.uni-muenchen.de
Sat May 12 07:05:02 EDT 2001


It's weekend and so it's time for a new syntax proposal...  :-)

After the recent clarification of the role of "import" and "export" and
a few other suggestions, here's my next shot:

------------------------------------------------------------------------
topdecl  : 'foreign' impexp callconv extent var '::' type

impexp   : 'import'
         | 'export'

callconv : <empty>            -- defaulting to 'ccall'
         | 'ccall'
         | 'stdcall'
         | 'cplusplus'
         | 'jvm'
         | 'dotnet'

extent   : string             -- Wake this optional? Which default then?
------------------------------------------------------------------------
Syntax for ccall/stdcall's import extent:

extent   : 'static' safety cid include   -- former f.i.
         | 'dynimp' safety               -- former f.i.d.
         | 'dynexp'                      -- former f.e.d.
         | '&'             cid include   -- former f.l.

safety   : <empty>
         | '!'               -- means "never re-enters Haskell world"

include  : <empty>
         | '<' <anything but '>'>* '>'
         | <anything but '<'> <anything>*
------------------------------------------------------------------------
Syntax for ccall/stdcall's export extent:

extent   : cid
------------------------------------------------------------------------

I don't have very strong feelings about other names for "dynimp"/"dynexp",
so I'll leave this to the native speakers.

An open point is the last case of the include production: Should we
implicitly wrap double quotes around it or not? I don't really like
such implicit things, but

    foreign import ccall "static !myproc \"myinclude.h\"" myProc :: ...

could look a little bit funny because of the backslashes. Again, I don't
really mind about that topic. But I'm against implicitly suffixing with
'.h' in any case.

The story above has a few advantages compared to the last proposal:

   * import/export explicitly tell you (= the compiler :-) if a new
     Haskell name is introduced or not, without inspecting extent.

   * Silly combinations like "an unsafe label" or "a dynamic import with
     a given C-name" don't exist.

   * It's (hopefully) more mnemonic, e.g. '&' reminds one of the C address-of
     operator, and '!' suggests something inherently dangerous.

Comments? We should really come to an agreement on the syntax soon...

Cheers,
   Sven




More information about the FFI mailing list