[MLton] syntax error for "_address"

John Reppy jhr@cs.uchicago.edu
Wed, 2 Nov 2005 10:07:39 -0600

Thanks for the info.  Is there likely to be a new snapshot of MLton  
soon?  Also, what is the best way
to package up an SML "library" that depends on generated C code  
(because of _export) and C libraries?
Can the MLB tool support the steps of generating, compiling, and  
linking the C code?

	- John

On Nov 2, 2005, at 9:54 AM, Matthew Fluet wrote:

>> I'm getting the error
>> 	Error: glut.sml 130.28.
>> 	  Syntax error: replacing  WILD with  ASTERISK.
>> where line 130 is
>> 	    val glutCreateMenuCB	= _address "glutCreateMenuCB" :  
>> MLton.Pointer.t;
>> I'm using the MLton command
>> 	mlton -default-ann 'allowFFI true' -stop tc -export-header glut-  
>> glue.h glut.sml
>> with version 20050731.  Was "_address" added since 20050731?
> Yup, we were in the process of a major overhaul of the FFI system  
> right around that time, and I don't recall why we did an  
> experimental release right then.
> In any case, at that moment in time, we had attempted to roll the  
> functionality of _address into _symbol with the following syntax:
>   _symbol "C variable name" attr... : cPtrTy, cBaseTy;
> which elaborates to an expression of type
>   cPtrTy * (unit -> cBaseTy) * (cBaseTy -> unit)
> So, you can get the functionality of _address using:
>  #1 (_symbol "sym" : MLton.Pointer.t, char;)
> That was not a very happy point in the design space.
> We ended up moving away from this in two directions.
> First, we unified all the ffi primitives so that the type  
> annotation is the same as the elaborated type.  We concluded that  
> if it lookslike a type annotation, then it should act like a type  
> annotation.  This can cause some extra verbosity.  For example, the  
> current syntax for _symbol seems to require you to mention cBaseTy  
> twice.  However, the annotation is just an arbitrary type, which is  
> elaborated before we inspect its form, so you can use a type  
> abbreviation to ease your burden.
> Second, we noted that there appeared to be sufficient cases where  
> one wanted the address of a C object for which a getter/setter  
> would not be appropriate.  For example, when taking the address of  
> a C function, you need to cook up some bogus cBaseTy for the getter  
> and setter.  It seemed to make more sense to allow taking the  
> address of an arbitrary C symbol without needing to delude  
> ourselves into thinking that it necessary corresponded to a mutable  
> cell of storage.