Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / ShowBasis
CommitLineData
7f918cf1
CE
1<!DOCTYPE html>\r
2<html lang="en">\r
3<head>\r
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\r
5<meta name="generator" content="AsciiDoc 8.6.9">\r
6<title>ShowBasis</title>\r
7<link rel="stylesheet" href="./asciidoc.css" type="text/css">\r
8<link rel="stylesheet" href="./pygments.css" type="text/css">\r
9\r
10\r
11<script type="text/javascript" src="./asciidoc.js"></script>\r
12<script type="text/javascript">\r
13/*<![CDATA[*/\r
14asciidoc.install();\r
15/*]]>*/\r
16</script>\r
17<link rel="stylesheet" href="./mlton.css" type="text/css">\r
18</head>\r
19<body class="article">\r
20<div id="banner">\r
21<div id="banner-home">\r
22<a href="./Home">MLton 20180207</a>\r
23</div>\r
24</div>\r
25<div id="header">\r
26<h1>ShowBasis</h1>\r
27</div>\r
28<div id="content">\r
29<div id="preamble">\r
30<div class="sectionbody">\r
31<div class="paragraph"><p>MLton has a flag, <span class="monospaced">-show-basis &lt;file&gt;</span>, that causes MLton to pretty\r
32print to <em>file</em> the basis defined by the input program. For example,\r
33if <span class="monospaced">foo.sml</span> contains</p></div>\r
34<div class="listingblock">\r
35<div class="content"><div class="highlight"><pre><span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>\r
36</pre></div></div></div>\r
37<div class="paragraph"><p>then <span class="monospaced">mlton -show-basis foo.basis foo.sml</span> will create <span class="monospaced">foo.basis</span>\r
38with the following contents.</p></div>\r
39<div class="listingblock">\r
40<div class="content monospaced">\r
41<pre>val f: int -&gt; int</pre>\r
42</div></div>\r
43<div class="paragraph"><p>If you only want to see the basis and do not wish to compile the\r
44program, you can call MLton with <span class="monospaced">-stop tc</span>.</p></div>\r
45</div>\r
46</div>\r
47<div class="sect1">\r
48<h2 id="_displaying_signatures">Displaying signatures</h2>\r
49<div class="sectionbody">\r
50<div class="paragraph"><p>When displaying signatures, MLton prefixes types defined in the\r
51signature them with <span class="monospaced">_sig.</span> to distinguish them from types defined in the\r
52environment. For example,</p></div>\r
53<div class="listingblock">\r
54<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
55<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
56<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
57<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>\r
58<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
59</pre></div></div></div>\r
60<div class="paragraph"><p>is displayed as</p></div>\r
61<div class="listingblock">\r
62<div class="content monospaced">\r
63<pre>signature SIG =\r
64 sig\r
65 type t\r
66 val x: _sig.t * int -&gt; unit\r
67 end</pre>\r
68</div></div>\r
69<div class="paragraph"><p>Notice that <span class="monospaced">int</span> occurs without the <span class="monospaced">_sig.</span> prefix.</p></div>\r
70<div class="paragraph"><p>MLton also uses a canonical name for each type in the signature, and\r
71that name is used everywhere for that type, no matter what the input\r
72signature looked like. For example:</p></div>\r
73<div class="listingblock">\r
74<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
75<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
76<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
77<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
78<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
79<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="p">:</span><span class="w"> </span><span class="n">u</span><span class="w"></span>\r
80<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
81</pre></div></div></div>\r
82<div class="paragraph"><p>is displayed as</p></div>\r
83<div class="listingblock">\r
84<div class="content monospaced">\r
85<pre>signature SIG =\r
86 sig\r
87 type t\r
88 type u = _sig.t\r
89 val x: _sig.t\r
90 val y: _sig.t\r
91 end</pre>\r
92</div></div>\r
93<div class="paragraph"><p>Canonical names are always relative to the "top" of the signature,\r
94even when used in nested substructures. For example:</p></div>\r
95<div class="listingblock">\r
96<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
97<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
98<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
99<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">w</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
100<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">U</span><span class="p">:</span><span class="w"></span>\r
101<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
102<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"></span>\r
103<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
104<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="p">:</span><span class="w"> </span><span class="n">u</span><span class="w"></span>\r
105<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
106<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">z</span><span class="p">:</span><span class="w"> </span><span class="n">U</span><span class="p">.</span><span class="n">u</span><span class="w"></span>\r
107<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
108</pre></div></div></div>\r
109<div class="paragraph"><p>is displayed as</p></div>\r
110<div class="listingblock">\r
111<div class="content monospaced">\r
112<pre>signature S =\r
113 sig\r
114 type t\r
115 val w: _sig.t\r
116 val z: _sig.U.u\r
117 structure U:\r
118 sig\r
119 type u\r
120 val x: _sig.t\r
121 val y: _sig.U.u\r
122 end\r
123 end</pre>\r
124</div></div>\r
125</div>\r
126</div>\r
127<div class="sect1">\r
128<h2 id="_displaying_structures">Displaying structures</h2>\r
129<div class="sectionbody">\r
130<div class="paragraph"><p>When displaying structures, MLton uses signature constraints wherever\r
131possible, combined with <span class="monospaced">where type</span> clauses to specify the meanings\r
132of the types defined within the signature. For example:</p></div>\r
133<div class="listingblock">\r
134<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
135<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
136<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
137<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
138<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
139<span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="p">:</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
140<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
141<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">int</span><span class="w"></span>\r
142<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
143<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
144<span class="k">structure</span><span class="w"> </span><span class="n">S2</span><span class="p">:&gt;</span><span class="w"> </span><span class="n">SIG</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">S</span><span class="w"></span>\r
145</pre></div></div></div>\r
146<div class="paragraph"><p>is displayed as</p></div>\r
147<div class="listingblock">\r
148<div class="content monospaced">\r
149<pre>signature SIG =\r
150 sig\r
151 type t\r
152 val x: _sig.t\r
153 end\r
154structure S: SIG\r
155 where type t = int\r
156structure S2: SIG\r
157 where type t = S2.t</pre>\r
158</div></div>\r
159</div>\r
160</div>\r
161</div>\r
162<div id="footnotes"><hr></div>\r
163<div id="footer">\r
164<div id="footer-text">\r
165</div>\r
166<div id="footer-badges">\r
167</div>\r
168</div>\r
169</body>\r
170</html>\r