<div dir="ltr">On Mon, Sep 1, 2008 at 5:10 AM, Matthew Fluet <span dir="ltr">&lt;<a href="mailto:fluet@tti-c.org">fluet@tti-c.org</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Commit r6680 adds and commit r6785 modifies the CFunction.SymbolScope.t datatype. &nbsp;When emitting a c-prototype, the symbol scope is translated thus:<br>
 &nbsp; &nbsp; &nbsp;val symbolScope =<br>
 &nbsp; &nbsp; &nbsp; &nbsp; case symbolScope of<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SymbolScope.External =&gt; &quot;IMPORTED &quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| SymbolScope.Private =&gt; &quot;INTERNAL &quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| SymbolScope.Public =&gt; &quot;EXPORTED &quot;<br>
which is then expanded by cpp via the &quot;export.h&quot; header.<br>
<br>
Is there a good reason to have a different names (i.e., External for SymbolScope.t, but &quot;IMPORTED&quot; for the macro)?</blockquote><div><br>The IMPORTED/EXPORTED/INTERNAL macros I stole from someone else who used those names. They nicely describe what is done operationally, IMO. When thinking about how I wanted my ML code to look, I wanted a higher-level point-of-view: what the compiler needs to know is where a symbol is coming from. The SymbolScope datatype matches the ML-source-level names.<br>
<br>That said, it would be better to use macros of the same name as in the ML source. I prefer the &quot;private/public/external&quot; labelling as it&#39;s more declarative in nature. Also &#39;_import &quot;foo&quot; imported&#39; or &#39;_export &quot;foo&quot; exported&#39; seems silly.<br>
<br>Which do you prefer?<br><br>Regarding the MLLIB_{PRIVATE/PUBLIC/whatever} macros, somehow what I&#39;d really like to do is define them based on if the header is used by C-code within the library or C-code outside the library, eg:<br>
<br>#ifdef PART_OF_LIBRARY_&lt;NAME-OF-LIBRARY&gt;<br>#define MLLIB_PRIVATE(x) PRIVATE x<br>#define MLLIB_PUBLIC(x) PUBLIC x<br>#else<br>#define MLLIB_PRIVATE(x)<br>#define MLLIB_PUBLIC(x) EXTERNAL x<br>#endif<br><br>MLLIB_PRIVATE(int foo();)<br>
MLLIB_PUBLIC(int bar();)<br><br>#undef MLLIB_PRIVATE<br>#undef MLLIB_PUBLIC<br><br>This would then need inclusion (or inline-copy) of exports.h.<br><br>A user using FFI as pary of his library would then do this:<br>#define PART_OF_LIBRARY_FOO<br>
#include &quot;foo.h&quot;<br><br>Meanwhile, anyone using libfoo would just do:<br>#include &quot;foo.h&quot;<br><br>Thoughts?</div></div></div>