<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="AsciiDoc 8.6.8">
<title>SMLNJLibrary</title>
<link rel="stylesheet" href="./asciidoc.css" type="text/css">
<link rel="stylesheet" href="./pygments.css" type="text/css">


<script type="text/javascript" src="./asciidoc.js"></script>
<script type="text/javascript">
/*<![CDATA[*/
asciidoc.install();
/*]]>*/
</script>
<link rel="stylesheet" href="./mlton.css" type="text/css"/>
</head>
<body class="article">
<div id="banner">
<div id="banner-home">
<a href="./Home">MLton 20130715</a>
</div>
</div>
<div id="header">
<h1>SMLNJLibrary</h1>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>The <a href="http://www.smlnj.org/doc/smlnj-lib/index.html">SML/NJ Library</a> is a
collection of libraries that are distributed with SML/NJ.  Due to
differences between SML/NJ and MLton, these libraries will not work
out-of-the box with MLton.</p></div>
<div class="paragraph"><p>As of 20130706, MLton includes a port of the SML/NJ Library
synchronized with SML/NJ version 110.76.</p></div>
</div>
</div>
<div class="sect1">
<h2 id="_usage">Usage</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
You can import a sub-library of the SML/NJ Library into an MLB file with:
</p>
<table class="tableblock frame-all grid-all"
style="
width:100%;
">
<col style="width:50%;">
<col style="width:50%;">
<thead>
<tr>
<th class="tableblock halign-left valign-top" >MLB file</th>
<th class="tableblock halign-left valign-top" >Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">Various utility modules, included collections, simple formating, &#8230;</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/Controls/controls-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">A library for managing control flags in an application.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/HashCons/hash-cons-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">Support for implementing hash-consed data structures.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/HTML/html-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">HTML 3.2 parsing and pretty-printing library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/HTML4/html4-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">HTML 4.01 parsing and pretty-printing library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/INet/inet-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">Networking utilities; supported on both Unix and Windows systems.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/JSON/json-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">JavaScript Object Notation (JSON) reading and writing library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/PP/pp-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">Pretty-printing library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/Reactive/reactive-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">Reactive scripting library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/RegExp/regexp-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">Regular expression library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/SExp/sexp-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">S-expression library.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top" ><p class="tableblock"><span class="monospaced">$(SML_LIB)/smlnj-lib/Unix/unix-lib.mlb</span></p></td>
<td class="tableblock halign-left valign-top" ><p class="tableblock">Utilities for Unix-based operating systems.</p></td>
</tr>
</tbody>
</table>
</li>
<li>
<p>
If you are porting a project from SML/NJ&#8217;s <a href="CompilationManager">CompilationManager</a> to
MLton&#8217;s <a href="MLBasis"> ML Basis system</a> using <span class="monospaced">cm2mlb</span>, note that the
following maps are included by default:
</p>
<div class="listingblock">
<div class="content monospaced">
<pre># SMLNJ Library
$SMLNJ-LIB                              $(SML_LIB)/smlnj-lib
$smlnj-lib.cm                           $(SML_LIB)/smlnj-lib/Util
$controls-lib.cm                        $(SML_LIB)/smlnj-lib/Controls
$hash-cons-lib.cm                       $(SML_LIB)/smlnj-lib/HashCons
$html-lib.cm                            $(SML_LIB)/smlnj-lib/HTML
$html4-lib.cm                           $(SML_LIB)/smlnj-lib/HTML4
$inet-lib.cm                            $(SML_LIB)/smlnj-lib/INet
$json-lib.cm                            $(SML_LIB)/smlnj-lib/JSON
$pp-lib.cm                              $(SML_LIB)/smlnj-lib/PP
$reactive-lib.cm                        $(SML_LIB)/smlnj-lib/Reactive
$regexp-lib.cm                          $(SML_LIB)/smlnj-lib/RegExp
$sexp-lib.cm                            $(SML_LIB)/smlnj-lib/SExp
$unix-lib.cm                            $(SML_LIB)/smlnj-lib/Unix</pre>
</div></div>
<div class="paragraph"><p>This will automatically convert a <span class="monospaced">$/smlnj-lib.cm</span> import in an input
<span class="monospaced">.cm</span> file into a <span class="monospaced">$(SML_LIB)/smlnj-lib/Util/smlnj-lib.mlb</span> import in
the output <span class="monospaced">.mlb</span> file.</p></div>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_details">Details</h2>
<div class="sectionbody">
<div class="paragraph"><p>The following changes were made to the SML/NJ Library, in addition to
deriving the <span class="monospaced">.mlb</span> files from the <span class="monospaced">.cm</span> files:</p></div>
<div class="ulist"><ul>
<li>
<p>
<span class="monospaced">HTML/html-attrs-fn.sml</span> (modified): Rewrote use of or-patterns.
</p>
</li>
<li>
<p>
<span class="monospaced">HTML/html-elements-fn.sml</span> (modified): Rewrote use of or-patterns.
</p>
</li>
<li>
<p>
<span class="monospaced">HTML4/pp-init.sml</span> (added): Implements <span class="monospaced">structure PrettyPrint</span> using the SML/NJ PP Library.  This implementation is taken from the SML/NJ compiler source, since the SML/NJ HTML4 Library used the <span class="monospaced">structure PrettyPrint</span> provided by the SML/NJ compiler itself.
</p>
</li>
<li>
<p>
<span class="monospaced">Util/base64.sml</span> (modified): Rewrote use of <span class="monospaced">Unsafe.CharVector.create</span> and <span class="monospaced">Unsafe.CharVector.update</span>; MLton assumes that vectors are immutable.
</p>
</li>
<li>
<p>
<span class="monospaced">Util/bit-array.sml</span> (modified): The computation of the <span class="monospaced">maxLen</span> is given by:
</p>
<div class="listingblock">
<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">maxLen</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">8</span><span class="n">*Word8Array</span><span class="p">.</span><span class="n">maxLen</span><span class="w"></span>
</pre></div></div></div>
<div class="paragraph"><p>This is fine in SML/NJ where <span class="monospaced">Word8Array.maxLen</span> is 16777215, but in MLton, <span class="monospaced">Word8Array.maxLen</span> is equal to <span class="monospaced">valOf(Int.maxInt)</span>, so the computation overflows. To accommodate both SML/NJ and MLton, the computation is replaced by</p></div>
<div class="listingblock">
<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">maxLen</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="mi">8</span><span class="n">*Word8Array</span><span class="p">.</span><span class="n">maxLen</span><span class="p">)</span><span class="w"> </span><span class="k">handle</span><span class="w"> </span><span class="n">Overflow</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">Word8Array</span><span class="p">.</span><span class="n">maxLen</span><span class="w"></span>
</pre></div></div></div>
</li>
<li>
<p>
<span class="monospaced">Util/engine.mlton.sml</span> (added, not exported): Implements <span class="monospaced">structure Engine</span>, providing time-limited, resumable computations using <a href="MLtonThread">MLtonThread</a>, <a href="MLtonSignal">MLtonSignal</a>, and <a href="MLtonItimer">MLtonItimer</a>.
</p>
</li>
<li>
<p>
<span class="monospaced">Util/graph-scc-fn.sml</span> (modified): Rewrote use of <span class="monospaced">where</span> structure specification.
</p>
</li>
<li>
<p>
<span class="monospaced">Util/redblack-map-fn.sml</span> (modified): Rewrote use of <span class="monospaced">where</span> structure specification.
</p>
</li>
<li>
<p>
<span class="monospaced">Util/redblack-set-fn.sml</span> (modified): Rewrote use of <span class="monospaced">where</span> structure specification.
</p>
</li>
<li>
<p>
<span class="monospaced">Util/time-limit.mlb</span> (added): Exports <span class="monospaced">structure TimeLimit</span>, which is <em>not</em> exported by <span class="monospaced">smlnj-lib.mlb</span>.  Since MLton is very conservative in the presence of threads and signals, program performance may be adversely affected by unnecessarily including <span class="monospaced">structure TimeLimit</span>.
</p>
</li>
<li>
<p>
<span class="monospaced">Util/time-limit.mlton.sml</span> (added): Implements <span class="monospaced">structure TimeLimit</span> using <span class="monospaced">structure Engine</span>.  The SML/NJ implementation of <span class="monospaced">structure TimeLimit</span> uses SML/NJ&#8217;s first-class continuations, signals, and interval timer.
</p>
</li>
</ul></div>
</div>
</div>
<div class="sect1">
<h2 id="_patch">Patch</h2>
<div class="sectionbody">
<div class="ulist"><ul>
<li>
<p>
<a href="https://github.com/MLton/mlton/blob/master/lib/smlnj-lib/smlnj-lib.patch"><span class="monospaced">smlnj-lib.patch</span></a>
</p>
</li>
</ul></div>
</div>
</div>
</div>
<div id="footnotes"><hr></div>
<div id="footer">
<div id="footer-text">
</div>
<div id="footer-badges">
</div>
</div>
</body>
</html>
