FFI Report comments
Malcolm.Wallace at cs.york.ac.uk
Tue Aug 21 06:45:18 EDT 2001
Here are my comments on the draft FFI Report itself. It looks very
good to me, and there are just a few things to mention.
The lexical syntax adds 'foreign' as a keyword (reservedid). I'm not
entirely convinced this is necessary. Certainly in nhc98 we treat
'foreign' as just a specialid, and so like with other specialids you
can name a variable 'foreign' if you wish. In other words, is there
any real reason to exclude the possibility of
module F (foreign, as) where
foreign :: X -> Y
foreign ... = ...
foreign import ccall "something" as :: CInt -> CInt -> CInt
which nhc98 currently accepts, but ghc -fglasgow-exts rejects?
Standard C Calls
fdecl -> 'import' callconv [safety] entity var '::' ftype
entity -> " ['static'] [fname] ['&'] ['['lib']'] [cid] "
suggest that the entity string must always be present, but could be
"". I was wondering if there is any real difficulty in permitting
an empty entity string to be omitted altogether? The idea would be
to be able to write
foreign import ccall sin :: CFloat -> CFloat
as at present rather than
foreign import ccall "" sin :: CFloat -> CFloat
It isn't a big deal, and it might be worth enforcing the literal string
quotes just for uniformity, but I thought I'd raise the issue anyway.
Int and Word
You want to drop the assertion that "arithmetic is performed
modulo 2^n" for sized Int and Word types, on the grounds that this
doesn't hold for Int. But Int is not of fixed size, so how could it
require modulo arithmetic! I happen to think the fact that Int is of
unspecified size >30 bits, with undefined behaviour on overflow, was
something of a mistake in Haskell. Now that we have the opportunity
to define a sensible overflow behaviour for fixed size types, I think
we should take it.
The statement "alignPtr yields the next higher address that fulfills
the alignment constraint" slightly conflicts with the following one
that "this operation is idempotent". I think the first statement
really means to say "alignPtr yields an address, the same or next
higher, that fulfills the alignment constraint".
It seems a little strange that there is an instance of Storable
for StablePtr, yet we are forbidden to use the methods of Storable
to dereference a StablePtr. In other words, I'm not quite clear on
exactly what is being forbidden.
HS_FLOAT_ROUND is called HS_FLOAT_ROUNDS in table 3.
There are a few typos and mis-spellings. Would it be easiest for
someone like me to fix these directly via CVS, or is it better to
just give you a list privately? I must admit that my experience of
using CVS for LaTeX documents was not a happy one, compared to how
useful it is for source code.
More information about the FFI