extended foreign decls
Manuel M. T. Chakravarty
chak at cse.unsw.edu.au
Tue Jan 2 19:25:42 EST 2001
Fergus Henderson <fjh at cs.mu.oz.au> wrote,
> On 02-Jan-2001, Manuel M. T. Chakravarty <chak at cse.unsw.edu.au> wrote:
> > [This comment is a bit late, I know...]
> > malcolm-ffi at cs.york.ac.uk wrote,
> > > Fergus writes, triggered by my suggestion of "foreign value":
> > >
> > > > Mercury supports this using `foreign_decls' and `foreign_code' pragmas.
> > >
> > > I refrained from proposing this in an earlier mail, but I've been
> > > thinking about it for a long time. I *really* *really* want to be
> > > able to insert small snippets of foreign code into the source of
> > > a Haskell module.
> > >
> > > GreenCard allows you to do this, via the %- or %C directives. It is
> > > one of the features I miss most about the new FFI. I know that it
> > > is always possible to write a small .c file and compile and link it
> > > in separately, but with the new FFI that now seems to necessitate
> > > writing an additional .h file as well. And all for a handful of lines
> > > of foreign code that could easily be kept in the Haskell source, with
> > > the ease-of-comprehension benefits entailed by keeping everything
> > > together that belongs together.
> > [..]
> > I believe that functionality like this should be implemented
> > by an extra tool rather than the Haskell compiler.
> Doing it in a separate tool will lose efficiency in some important
> cases. If the compiler is compiling via C, then it can insert
> inline C code directly in the generated code, and thus get
> inlining. But I think a separate tool would have to put the C code in
> a separate C file, which would prevent inlining.
This has some problematic consequences:
* Code which replies on this inlining would require any
high-performance Haskell compiler to compile via C.
* As I understand, these pragmas are supposed to support not
only C. How about C++ code? Will there be a C++ backend
for Mercury just to make this code efficient?
More information about the FFI