Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / Elaborate
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>Elaborate</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>Elaborate</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><a href="Elaborate">Elaborate</a> is a translation pass from the <a href="AST">AST</a>\r
32<a href="IntermediateLanguage">IntermediateLanguage</a> to the <a href="CoreML">CoreML</a> <a href="IntermediateLanguage">IntermediateLanguage</a>.</p></div>\r
33</div>\r
34</div>\r
35<div class="sect1">\r
36<h2 id="_description">Description</h2>\r
37<div class="sectionbody">\r
38<div class="paragraph"><p>This pass performs type inference and type checking according to the\r
39<a href="DefinitionOfStandardML">Definition</a>. It also defunctorizes the\r
40program, eliminating all module-level constructs.</p></div>\r
41</div>\r
42</div>\r
43<div class="sect1">\r
44<h2 id="_implementation">Implementation</h2>\r
45<div class="sectionbody">\r
46<div class="ulist"><ul>\r
47<li>\r
48<p>\r
49<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate.sig"><span class="monospaced">elaborate.sig</span></a>\r
50</p>\r
51</li>\r
52<li>\r
53<p>\r
54<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate.fun"><span class="monospaced">elaborate.fun</span></a>\r
55</p>\r
56</li>\r
57<li>\r
58<p>\r
59<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate-env.sig"><span class="monospaced">elaborate-env.sig</span></a>\r
60</p>\r
61</li>\r
62<li>\r
63<p>\r
64<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate-env.fun"><span class="monospaced">elaborate-env.fun</span></a>\r
65</p>\r
66</li>\r
67<li>\r
68<p>\r
69<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate-modules.sig"><span class="monospaced">elaborate-modules.sig</span></a>\r
70</p>\r
71</li>\r
72<li>\r
73<p>\r
74<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate-modules.fun"><span class="monospaced">elaborate-modules.fun</span></a>\r
75</p>\r
76</li>\r
77<li>\r
78<p>\r
79<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate-core.sig"><span class="monospaced">elaborate-core.sig</span></a>\r
80</p>\r
81</li>\r
82<li>\r
83<p>\r
84<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/elaborate-core.fun"><span class="monospaced">elaborate-core.fun</span></a>\r
85</p>\r
86</li>\r
87<li>\r
88<p>\r
89<a href="https://github.com/MLton/mlton/tree/master/mlton/elaborate"><span class="monospaced">elaborate</span></a>\r
90</p>\r
91</li>\r
92</ul></div>\r
93</div>\r
94</div>\r
95<div class="sect1">\r
96<h2 id="_details_and_notes">Details and Notes</h2>\r
97<div class="sectionbody">\r
98<div class="paragraph"><p>At the modules level, the <a href="Elaborate">Elaborate</a> pass:</p></div>\r
99<div class="ulist"><ul>\r
100<li>\r
101<p>\r
102elaborates signatures with interfaces (see\r
103<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/interface.sig"><span class="monospaced">interface.sig</span></a> and\r
104<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/interface.fun"><span class="monospaced">interface.fun</span></a>)\r
105</p>\r
106<div class="paragraph"><p>The main trick is to use disjoint sets to efficiently handle sharing\r
107of tycons and of structures and then to copy signatures as dags rather\r
108than as trees.</p></div>\r
109</li>\r
110<li>\r
111<p>\r
112checks functors at the point of definition, using functor summaries\r
113to speed up checking of functor applications.\r
114</p>\r
115<div class="paragraph"><p>When a functor is first type checked, we keep track of the dummy\r
116argument structure and the dummy result structure, as well as all the\r
117tycons that were created while elaborating the body. Then, if we\r
118later need to type check an application of the functor (as opposed to\r
119defunctorize an application), we pair up tycons in the dummy argument\r
120structure with the actual argument structure and then replace the\r
121dummy tycons with the actual tycons in the dummy result structure,\r
122yielding the actual result structure. We also generate new tycons for\r
123all the tycons that we created while originally elaborating the body.</p></div>\r
124</li>\r
125<li>\r
126<p>\r
127handles opaque signature constraints.\r
128</p>\r
129<div class="paragraph"><p>This is implemented by building a dummy structure realized from the\r
130signature, just as we would for a functor argument when type checking\r
131a functor. The dummy structure contains exactly the type information\r
132that is in the signature, which is what opacity requires. We then\r
133replace the variables (and constructors) in the dummy structure with\r
134the corresponding variables (and constructors) from the actual\r
135structure so that the translation to <a href="CoreML">CoreML</a> uses the right stuff.\r
136For each tycon in the dummy structure, we keep track of the\r
137corresponding type structure in the actual structure. This is used\r
138when producing the <a href="CoreML">CoreML</a> types (see <span class="monospaced">expandOpaque</span> in\r
139<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/type-env.sig"><span class="monospaced">type-env.sig</span></a> and\r
140<a href="https://github.com/MLton/mlton/blob/master/mlton/elaborate/type-env.fun"><span class="monospaced">type-env.fun</span></a>).</p></div>\r
141<div class="paragraph"><p>Then, within each <span class="monospaced">structure</span> or <span class="monospaced">functor</span> body, for each declaration\r
142(<span class="monospaced">&lt;dec&gt;</span> in the <a href="StandardML">Standard ML</a> grammar), the <a href="Elaborate">Elaborate</a>\r
143pass does three steps:</p></div>\r
144<div class="openblock">\r
145<div class="content">\r
146<div class="olist arabic"><ol class="arabic">\r
147<li>\r
148<p>\r
149<a href="ScopeInference">ScopeInference</a>\r
150</p>\r
151</li>\r
152<li>\r
153<p>\r
154</p>\r
155<div class="ulist"><ul>\r
156<li>\r
157<p>\r
158<a href="PrecedenceParse">PrecedenceParse</a>\r
159</p>\r
160</li>\r
161<li>\r
162<p>\r
163<span class="monospaced">_{ex,im}port</span> expansion\r
164</p>\r
165</li>\r
166<li>\r
167<p>\r
168profiling insertion\r
169</p>\r
170</li>\r
171<li>\r
172<p>\r
173unification\r
174</p>\r
175</li>\r
176</ul></div>\r
177</li>\r
178<li>\r
179<p>\r
180Overloaded {constant, function, record pattern} resolution\r
181</p>\r
182</li>\r
183</ol></div>\r
184</div></div>\r
185</li>\r
186</ul></div>\r
187<div class="sect2">\r
188<h3 id="_defunctorization">Defunctorization</h3>\r
189<div class="paragraph"><p>The <a href="Elaborate">Elaborate</a> pass performs a number of duties historically\r
190assigned to the <a href="Defunctorize">Defunctorize</a> pass.</p></div>\r
191<div class="paragraph"><p>As part of the <a href="Elaborate">Elaborate</a> pass, all module level constructs\r
192(<span class="monospaced">open</span>, <span class="monospaced">signature</span>, <span class="monospaced">structure</span>, <span class="monospaced">functor</span>, long identifiers) are\r
193removed. This works because the <a href="Elaborate">Elaborate</a> pass assigns a unique\r
194name to every type and variable in the program. This also allows the\r
195<a href="Elaborate">Elaborate</a> pass to eliminate <span class="monospaced">local</span> declarations, which are purely\r
196for namespace management.</p></div>\r
197</div>\r
198</div>\r
199</div>\r
200<div class="sect1">\r
201<h2 id="_examples">Examples</h2>\r
202<div class="sectionbody">\r
203<div class="paragraph"><p>Here are a number of examples of elaboration.</p></div>\r
204<div class="ulist"><ul>\r
205<li>\r
206<p>\r
207All variables bound in <span class="monospaced">val</span> declarations are renamed.\r
208</p>\r
209<div class="listingblock">\r
210<div class="content"><div class="highlight"><pre><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
211<span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>\r
212</pre></div></div></div>\r
213<div class="listingblock">\r
214<div class="content monospaced">\r
215<pre>val x_0 = 13\r
216val y_0 = x_0</pre>\r
217</div></div>\r
218</li>\r
219<li>\r
220<p>\r
221All variables in <span class="monospaced">fun</span> declarations are renamed.\r
222</p>\r
223<div class="listingblock">\r
224<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">g</span><span class="w"> </span><span class="n">x</span><span class="w"></span>\r
225<span class="k">and</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">y</span><span class="w"></span>\r
226</pre></div></div></div>\r
227<div class="listingblock">\r
228<div class="content monospaced">\r
229<pre>fun f_0 x_0 = g_0 x_0\r
230and g_0 y_0 = f_0 y_0</pre>\r
231</div></div>\r
232</li>\r
233<li>\r
234<p>\r
235Type abbreviations are removed, and the abbreviation is expanded\r
236wherever it is used.\r
237</p>\r
238<div class="listingblock">\r
239<div class="content"><div class="highlight"><pre><span class="k">type</span><span class="w"> </span><span class="n">&#39;a</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">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"></span>\r
240<span class="k">type</span><span class="w"> </span><span class="n">&#39;b</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">&#39;b</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">real</span><span class="w"></span>\r
241<span class="k">fun</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bool</span><span class="w"> </span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>\r
242</pre></div></div></div>\r
243<div class="listingblock">\r
244<div class="content monospaced">\r
245<pre>fun f_0 (x_0 : (int * bool) * real) = x_0</pre>\r
246</div></div>\r
247</li>\r
248<li>\r
249<p>\r
250Exception declarations create a new constructor and rename the type.\r
251</p>\r
252<div class="listingblock">\r
253<div class="content"><div class="highlight"><pre><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
254<span class="k">exception</span><span class="w"> </span><span class="n">E</span><span class="w"> </span><span class="k">of</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">real</span><span class="w"></span>\r
255</pre></div></div></div>\r
256<div class="listingblock">\r
257<div class="content monospaced">\r
258<pre>exception E_0 of int * real</pre>\r
259</div></div>\r
260</li>\r
261<li>\r
262<p>\r
263The type and value constructors in datatype declarations are renamed.\r
264</p>\r
265<div class="listingblock">\r
266<div class="content"><div class="highlight"><pre><span class="k">datatype</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">A</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">real</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
267</pre></div></div></div>\r
268<div class="listingblock">\r
269<div class="content monospaced">\r
270<pre>datatype t_0 = A_0 of int | B_0 of real * t_0</pre>\r
271</div></div>\r
272</li>\r
273<li>\r
274<p>\r
275Local declarations are moved to the top-level. The environment\r
276keeps track of the variables in scope.\r
277</p>\r
278<div class="listingblock">\r
279<div class="content"><div class="highlight"><pre><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
280<span class="k">local</span><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">14</span><span class="w"></span>\r
281<span class="k">in</span><span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>\r
282<span class="k">end</span><span class="w"></span>\r
283<span class="k">val</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>\r
284</pre></div></div></div>\r
285<div class="listingblock">\r
286<div class="content monospaced">\r
287<pre>val x_0 = 13\r
288val x_1 = 14\r
289val y_0 = x_1\r
290val z_0 = x_0</pre>\r
291</div></div>\r
292</li>\r
293<li>\r
294<p>\r
295Structure declarations are eliminated, with all declarations moved\r
296to the top level. Long identifiers are renamed.\r
297</p>\r
298<div class="listingblock">\r
299<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
300<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
301<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
302<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="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
303<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
304<span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">S</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">S</span><span class="p">.</span><span class="n">x</span><span class="w"></span>\r
305</pre></div></div></div>\r
306<div class="listingblock">\r
307<div class="content monospaced">\r
308<pre>val x_0 : int = 13\r
309val y_0 : int = x_0</pre>\r
310</div></div>\r
311</li>\r
312<li>\r
313<p>\r
314Open declarations are eliminated.\r
315</p>\r
316<div class="listingblock">\r
317<div class="content"><div class="highlight"><pre><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
318<span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">14</span><span class="w"></span>\r
319<span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
320<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
321<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">15</span><span class="w"></span>\r
322<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
323<span class="k">open</span><span class="w"> </span><span class="n">S</span><span class="w"></span>\r
324<span class="k">val</span><span class="w"> </span><span class="n">z</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="n">y</span><span class="w"></span>\r
325</pre></div></div></div>\r
326<div class="listingblock">\r
327<div class="content monospaced">\r
328<pre>val x_0 = 13\r
329val y_0 = 14\r
330val x_1 = 15\r
331val z_0 = x_1 + y_0</pre>\r
332</div></div>\r
333</li>\r
334<li>\r
335<p>\r
336Functor declarations are eliminated, and the body of a functor is\r
337duplicated wherever the functor is applied.\r
338</p>\r
339<div class="listingblock">\r
340<div class="content"><div class="highlight"><pre><span class="k">functor</span><span class="w"> </span><span class="n">F</span><span class="p">(</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="n">int</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
341<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
342<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>\r
343<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
344<span class="k">structure</span><span class="w"> </span><span class="n">F1</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">(</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="p">)</span><span class="w"></span>\r
345<span class="k">structure</span><span class="w"> </span><span class="n">F2</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="p">(</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">14</span><span class="p">)</span><span class="w"></span>\r
346<span class="k">val</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F1</span><span class="p">.</span><span class="n">y</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="n">F2</span><span class="p">.</span><span class="n">y</span><span class="w"></span>\r
347</pre></div></div></div>\r
348<div class="listingblock">\r
349<div class="content monospaced">\r
350<pre>val x_0 = 13\r
351val y_0 = x_0\r
352val x_1 = 14\r
353val y_1 = x_1\r
354val z_0 = y_0 + y_1</pre>\r
355</div></div>\r
356</li>\r
357<li>\r
358<p>\r
359Signature constraints are eliminated. Note that signatures do\r
360affect how subsequent variables are renamed.\r
361</p>\r
362<div class="listingblock">\r
363<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
364<span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
365<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="n">int</span><span class="w"></span>\r
366<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
367<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
368<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">14</span><span class="w"></span>\r
369<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">x</span><span class="w"></span>\r
370<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
371<span class="k">open</span><span class="w"> </span><span class="n">S</span><span class="w"></span>\r
372<span class="k">val</span><span class="w"> </span><span class="n">z</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="n">y</span><span class="w"></span>\r
373</pre></div></div></div>\r
374<div class="listingblock">\r
375<div class="content monospaced">\r
376<pre>val y_0 = 13\r
377val x_0 = 14\r
378val y_1 = x_0\r
379val z_0 = x_0 + y_0</pre>\r
380</div></div>\r
381</li>\r
382</ul></div>\r
383</div>\r
384</div>\r
385</div>\r
386<div id="footnotes"><hr></div>\r
387<div id="footer">\r
388<div id="footer-text">\r
389</div>\r
390<div id="footer-badges">\r
391</div>\r
392</div>\r
393</body>\r
394</html>\r