<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.23">
<title>ShowBasis</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<link rel="stylesheet" href="./asciidoctor.css">
<link rel="stylesheet" href="./rouge-github.css">
<link rel="stylesheet" href="./mlton.css">

</head>
<body class="article">
<div id="mlton-header">
<div id="mlton-header-text">
<h2>
<a href="./Home">
MLton
20241230
</a>
</h2>
</div>
</div>
<div id="header">
<h1>ShowBasis</h1>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>MLton has a flag, <code>-show-basis &lt;file&gt;</code>, that causes MLton to pretty
print to <em>file</em> the basis defined by the input program.  For example,
if <code>foo.sml</code> contains</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sml"><span class="kr">fun</span> <span class="nf">f</span> <span class="n">x</span> <span class="p">=</span> <span class="n">x</span> <span class="n">+</span> <span class="mi">1</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>then <code>mlton -show-basis foo.basis foo.sml</code> will create <code>foo.basis</code>
with the following contents.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>val f: int -&gt; int</pre>
</div>
</div>
<div class="paragraph">
<p>If you only want to see the basis and do not wish to compile the
program, you can call MLton with <code>-stop tc</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_displaying_signatures">Displaying signatures</h2>
<div class="sectionbody">
<div class="paragraph">
<p>When displaying signatures, MLton prefixes types defined in the
signature them with <code>_sig.</code> to distinguish them from types defined in the
environment.  For example,</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sml"><span class="kr">signature</span> <span class="nn">SIG</span> <span class="p">=</span>
   <span class="kr">sig</span>
      <span class="kr">type</span> <span class="kt">t</span>
      <span class="kr">val</span> <span class="nv">x</span><span class="p">:</span> <span class="n">t</span> <span class="n">*</span> <span class="n">int</span> <span class="p">-&gt;</span> <span class="n">unit</span>
   <span class="kr">end</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>is displayed as</p>
</div>
<div class="listingblock">
<div class="content">
<pre>signature SIG =
   sig
      type t
      val x: _sig.t * int -&gt; unit
   end</pre>
</div>
</div>
<div class="paragraph">
<p>Notice that <code>int</code> occurs without the <code>_sig.</code> prefix.</p>
</div>
<div class="paragraph">
<p>MLton also uses a canonical name for each type in the signature, and
that name is used everywhere for that type, no matter what the input
signature looked like.  For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sml"><span class="kr">signature</span> <span class="nn">SIG</span> <span class="p">=</span>
   <span class="kr">sig</span>
      <span class="kr">type</span> <span class="kt">t</span>
      <span class="kr">type</span> <span class="kt">u</span> <span class="p">=</span> <span class="n">t</span>
      <span class="kr">val</span> <span class="nv">x</span><span class="p">:</span> <span class="n">t</span>
      <span class="kr">val</span> <span class="nv">y</span><span class="p">:</span> <span class="n">u</span>
   <span class="kr">end</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>is displayed as</p>
</div>
<div class="listingblock">
<div class="content">
<pre>signature SIG =
   sig
      type t
      type u = _sig.t
      val x: _sig.t
      val y: _sig.t
   end</pre>
</div>
</div>
<div class="paragraph">
<p>Canonical names are always relative to the "top" of the signature,
even when used in nested substructures.  For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sml"><span class="kr">signature</span> <span class="nn">S</span> <span class="p">=</span>
   <span class="kr">sig</span>
      <span class="kr">type</span> <span class="kt">t</span>
      <span class="kr">val</span> <span class="nv">w</span><span class="p">:</span> <span class="n">t</span>
      <span class="kr">structure</span> <span class="nn">U</span><span class="p">:</span>
         <span class="kr">sig</span>
            <span class="kr">type</span> <span class="kt">u</span>
            <span class="kr">val</span> <span class="nv">x</span><span class="p">:</span> <span class="n">t</span>
            <span class="kr">val</span> <span class="nv">y</span><span class="p">:</span> <span class="n">u</span>
         <span class="kr">end</span>
      <span class="kr">val</span> <span class="nv">z</span><span class="p">:</span> <span class="nn">U</span><span class="p">.</span><span class="n">u</span>
   <span class="kr">end</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>is displayed as</p>
</div>
<div class="listingblock">
<div class="content">
<pre>signature S =
   sig
      type t
      val w: _sig.t
      val z: _sig.U.u
      structure U:
         sig
            type u
            val x: _sig.t
            val y: _sig.U.u
         end
   end</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_displaying_structures">Displaying structures</h2>
<div class="sectionbody">
<div class="paragraph">
<p>When displaying structures, MLton uses signature constraints wherever
possible, combined with <code>where type</code> clauses to specify the meanings
of the types defined within the signature.  For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="rouge highlight"><code data-lang="sml"><span class="kr">signature</span> <span class="nn">SIG</span> <span class="p">=</span>
   <span class="kr">sig</span>
      <span class="kr">type</span> <span class="kt">t</span>
      <span class="kr">val</span> <span class="nv">x</span><span class="p">:</span> <span class="n">t</span>
   <span class="kr">end</span>
<span class="kr">structure</span> <span class="nn">S</span><span class="p">:</span> <span class="n">SIG</span> <span class="p">=</span>
   <span class="kr">struct</span>
      <span class="kr">type</span> <span class="kt">t</span> <span class="p">=</span> <span class="n">int</span>
      <span class="kr">val</span> <span class="nv">x</span> <span class="p">=</span> <span class="mi">13</span>
   <span class="kr">end</span>
<span class="kr">structure</span> <span class="nn">S2</span><span class="p">:&gt;</span> <span class="n">SIG</span> <span class="p">=</span> <span class="n">S</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>is displayed as</p>
</div>
<div class="listingblock">
<div class="content">
<pre>signature SIG =
   sig
      type t
      val x: _sig.t
   end
structure S: SIG
             where type t = int
structure S2: SIG
              where type t = S2.t</pre>
</div>
</div>
</div>
</div>
</div>
<div id="mlton-footer">
<div id="mlton-footer-text">
<div>
Last updated Thu Oct 21 15:53:06 2021 -0400 by Matthew Fluet.
<a href="https://github.com/MLton/mlton/commits/master/doc/guide/src/ShowBasis.adoc">Log</a>
<a href="https://github.com/MLton/mlton/edit/master/doc/guide/src/ShowBasis.adoc">Edit</a>
</div>
</div>
</body>
</html>