<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta name="robots" content="index,nofollow"> <title>ForeignFunctionInterfaceSyntax - MLton Standard ML Compiler (SML Compiler)</title> <link rel="stylesheet" type="text/css" charset="iso-8859-1" media="all" href="common.css"> <link rel="stylesheet" type="text/css" charset="iso-8859-1" media="screen" href="screen.css"> <link rel="stylesheet" type="text/css" charset="iso-8859-1" media="print" href="print.css"> <link rel="Start" href="Home"> </head> <body lang="en" dir="ltr"> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script> <script type="text/javascript"> _uacct = "UA-833377-1"; urchinTracker(); </script> <table bgcolor = lightblue cellspacing = 0 style = "border: 0px;" width = 100%> <tr> <td style = " border: 0px; color: darkblue; font-size: 150%; text-align: left;"> <a class = mltona href="Home">MLton MLTONWIKIVERSION</a> <td style = " border: 0px; font-size: 150%; text-align: center; width: 50%;"> ForeignFunctionInterfaceSyntax <td style = " border: 0px; text-align: right;"> <table cellspacing = 0 style = "border: 0px"> <tr style = "vertical-align: middle;"> </table> <tr style = "background-color: white;"> <td colspan = 3 style = " border: 0px; font-size:70%; text-align: right;"> <a href = "Home">Home</a> <a href = "TitleIndex">Index</a> </table> <div id="content" lang="en" dir="ltr"> MLton extends the syntax of SML with expressions that enable a <a href="ForeignFunctionInterface">ForeignFunctionInterface</a> to C. The following description of the syntax uses some abbreviations. <div> <table> <tr> <td> C base type </td> <td> <em>cBaseTy</em> </td> <td> <a href="ForeignFunctionInterfaceTypes"> Foreign Function Interface types</a> </td> </tr> <tr> <td> C argument type </td> <td> <em>cArgTy</em> </td> <td> <em>cBaseTy</em><sub>1</sub><tt> * </tt>...<tt> * </tt><em>cBaseTy</em><sub>n</sub> or <tt>unit</tt> </td> </tr> <tr> <td> C return type </td> <td> <em>cRetTy</em> </td> <td> <em>cBaseTy</em> or <tt>unit</tt> </td> </tr> <tr> <td> C function type </td> <td> <em>cFuncTy</em> </td> <td> <em>cArgTy</em><tt> -> </tt><em>cRetTy</em> </td> </tr> <tr> <td> C pointer type </td> <td> <em>cPtrTy</em> </td> <td> <tt>MLton.Pointer.t</tt> </td> </tr> </table> </div> <p> The type annotation and the semicolon are not optional in the syntax of <a href="ForeignFunctionInterface">ForeignFunctionInterface</a> expressions. However, the type is lexed, parsed, and elaborated as an SML type, so any type (including type abbreviations) may be used, so long as it elaborates to a type of the correct form. </p> <h2 id="head-d70f93df5e8f9b55be44fbeee9d203972e3383d4">Address</h2> <pre>_address "CFunctionOrVariableName" attr... : cPtrTy; </pre><p> Denotes the address of the C function or variable. </p> <p> <tt>attr...</tt> denotes a (possibly empty) sequence of attributes. The following attributes are recognized: </p> <ul> <li> <p> <tt>external</tt> : import with external symbol scope (see <a href="LibrarySupport">LibrarySupport</a>) (default). </p> </li> <li> <p> <tt>private</tt> : import with private symbol scope (see <a href="LibrarySupport">LibrarySupport</a>). </p> </li> <li> <p> <tt>public</tt> : import with public symbol scope (see <a href="LibrarySupport">LibrarySupport</a>). </p> </li> </ul> <p> See <a href="MLtonPointer"> MLtonPointer</a> for functions that manipulate C pointers. </p> <h2 id="head-3f84ef531f9db996694ad09a8fdddbca1440577e">Symbol</h2> <pre>_symbol "CVariableName" attr... : (unit -> cBaseTy) * (cBaseTy -> unit); </pre><p> Denotes the <em>getter</em> and <em>setter</em> for a C variable. The <em>cBaseTy</em>s must be identical. </p> <p> <tt>attr...</tt> denotes a (possibly empty) sequence of attributes. The following attributes are recognized: </p> <ul> <li> <p> <tt>alloc</tt> : allocate storage (and export a symbol) for the C variable. </p> </li> <li> <p> <tt>external</tt> : import or export with external symbol scope (see <a href="LibrarySupport">LibrarySupport</a>) (default if not <tt>alloc</tt>). </p> </li> <li> <p> <tt>private</tt> : import or export with private symbol scope (see <a href="LibrarySupport">LibrarySupport</a>). </p> </li> <li> <p> <tt>public</tt> : import or export with public symbol scope (see <a href="LibrarySupport">LibrarySupport</a>) (default if <tt>alloc</tt>). </p> </li> </ul> <pre>_symbol * : cPtrTy -> (unit -> cBaseTy) * (cBaseTy -> unit); </pre><p> Denotes the <em>getter</em> and <em>setter</em> for a C pointer to a variable. The <em>cBaseTy</em>s must be identical. </p> <h2 id="head-d6fbc9d2bdd580e18ed0bc5805dc26db323d6f5f">Import</h2> <pre>_import "CFunctionName" attr... : cFuncTy; </pre><p> Denotes an SML function whose behavior is implemented by calling the C function. See <a href="CallingFromSMLToC"> Calling from SML to C</a> for more details. </p> <p> <tt>attr...</tt> denotes a (possibly empty) sequence of attributes. The following attributes are recognized: </p> <ul> <li> <p> <tt>cdecl</tt> : call with the <tt>cdecl</tt> calling convention (default). </p> </li> <li> <p> <tt>external</tt> : import with external symbol scope (see <a href="LibrarySupport">LibrarySupport</a>) (default). </p> </li> <li> <p> <tt>private</tt> : import with private symbol scope (see <a href="LibrarySupport">LibrarySupport</a>). </p> </li> <li> <p> <tt>public</tt> : import with public symbol scope (see <a href="LibrarySupport">LibrarySupport</a>). </p> </li> <li> <p> <tt>stdcall</tt> : call with the <tt>stdcall</tt> calling convention (ignored except on Cygwin and MinGW). </p> </li> </ul> <pre>_import * attr... : cPtrTy -> cFuncTy; </pre><p> Denotes an SML function whose behavior is implemented by calling a C function through a C function pointer. </p> <p> <tt>attr...</tt> denotes a (possibly empty) sequence of attributes. The following attributes are recognized: </p> <ul> <li> <p> <tt>cdecl</tt> : call with the <tt>cdecl</tt> calling convention (default). </p> </li> <li> <p> <tt>stdcall</tt> : call with the <tt>stdcall</tt> calling convention (ignored except on Cygwin and MinGW). </p> </li> </ul> <p> See <a href="CallingFromSMLToCFunctionPointer"> Calling from SML to C function pointer</a> for more details. </p> <h2 id="head-f3e4fadb9e370a1e2c0c622c01fc8c77daf93a2c">Export</h2> <pre>_export "CFunctionName" attr... : cFuncTy -> unit; </pre><p> Exports a C function with the name <tt>CFunctionName</tt> that can be used to call an SML function of the type <em>cFuncTy</em>. When the function denoted by the export expression is applied to an SML function <tt>f</tt>, subsequent C calls to <tt>CFunctionName</tt> will call <tt>f</tt>. It is an error to call <tt>CFunctionName</tt> before the export has been applied. The export may be applied more than once, with each application replacing any previous definition of <tt>CFunctionName</tt>. </p> <p> <tt>attr...</tt> denotes a (possibly empty) sequence of attributes. The following attributes are recognized: </p> <ul> <li> <p> <tt>cdecl</tt> : call with the <tt>cdecl</tt> calling convention (default). </p> </li> <li> <p> <tt>private</tt> : export with private symbol scope (see <a href="LibrarySupport">LibrarySupport</a>). </p> </li> <li> <p> <tt>public</tt> : export with public symbol scope (see <a href="LibrarySupport">LibrarySupport</a>) (default). </p> </li> <li> <p> <tt>stdcall</tt> : call with the <tt>stdcall</tt> calling convention (ignored except on Cygwin and MinGW). </p> </li> </ul> <p> See <a href="CallingFromCToSML"> Calling from C to SML</a> for more details. </p> </div> <p> <hr> Last edited on 2009-06-22 16:17:40 by <span title="c-67-165-143-160.hsd1.il.comcast.net"><a href="MatthewFluet">MatthewFluet</a></span>. </body></html>