I must say that I like Manuel's proposal below. I'm a bit alarmed
about the proliferation of features in the FFI, but Manuel's story
makes it seem more tractable. It's in the spirit of putting all
the language-specific info needed for a particular foreign import
into a single string.
The FFI spec should have a section specifying the syntax of this
string for a selection of languages.
Incidentally, we should make the order of 'import/export' , 'dynamic',
'unsafe' keywords arbitrary. So you should be able to write
foreign import unsafe dynamic ...
or
foreign import dynamic unsafe ...
I'm not sure exactly which the unordered set should be, maybe
the optional components.
Simon
| I am still against cpp, but maybe we can relegate defaults
| to the tools domain in general (and whoever is fond of cpp,
| can use cpp). Without defaults, it is still possible to use
| all features of the FFI. If a user wants the convenience of
| defaults, she has to use a tool (as with all the other
| "features" that we considered too heavy for the core FFI).
|| Then, we could use the following general form of foreign
| imports:
|| foreign import [callconv] [funname] ['unsafe'] varid :: prim_type
|| where funname is calling-convention dependent and in the
| case of ccall is either merely the name of the imported
| symbol or an include specification followed by a colon and,
| then, the imported symbol. So, we have
|| foreign import ccall "gtk_window_new"
| windowNew :: CInt -> IO (Ptr Window)
|| or
|| foreign import ccall "<gtk/gtk.h>:gtk_window_new"
| windowNew :: CInt -> IO (Ptr Window)
|| If the <.> are omitted in the include specification, it
| corresponds to an #include"...".