Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / MatchCompile
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>MatchCompile</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>MatchCompile</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="MatchCompile">MatchCompile</a> is a translation pass, agnostic in the\r
32<a href="IntermediateLanguage">IntermediateLanguage</a>s between which it translates.</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><a href="MatchCompilation">Match compilation</a> converts a case expression with\r
39nested patterns into a case expression with flat patterns.</p></div>\r
40</div>\r
41</div>\r
42<div class="sect1">\r
43<h2 id="_implementation">Implementation</h2>\r
44<div class="sectionbody">\r
45<div class="ulist"><ul>\r
46<li>\r
47<p>\r
48<a href="https://github.com/MLton/mlton/blob/master/mlton/match-compile/match-compile.sig"><span class="monospaced">match-compile.sig</span></a>\r
49</p>\r
50</li>\r
51<li>\r
52<p>\r
53<a href="https://github.com/MLton/mlton/blob/master/mlton/match-compile/match-compile.fun"><span class="monospaced">match-compile.fun</span></a>\r
54</p>\r
55</li>\r
56</ul></div>\r
57</div>\r
58</div>\r
59<div class="sect1">\r
60<h2 id="_details_and_notes">Details and Notes</h2>\r
61<div class="sectionbody">\r
62<div class="listingblock">\r
63<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">matchCompile</span><span class="p">:</span><span class="w"></span>\r
64<span class="w"> </span><span class="p">{</span><span class="n">caseType</span><span class="p">:</span><span class="w"> </span><span class="n">Type</span><span class="p">.</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="cm">(* type of entire expression *)</span><span class="w"></span>\r
65<span class="w"> </span><span class="n">cases</span><span class="p">:</span><span class="w"> </span><span class="p">(</span><span class="n">NestedPat</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">((</span><span class="n">Var</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">Var</span><span class="p">.</span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">Exp</span><span class="p">.</span><span class="n">t</span><span class="p">))</span><span class="w"> </span><span class="n">vector</span><span class="p">,</span><span class="w"></span>\r
66<span class="w"> </span><span class="n">conTycon</span><span class="p">:</span><span class="w"> </span><span class="n">Con</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">Tycon</span><span class="p">.</span><span class="n">t</span><span class="p">,</span><span class="w"></span>\r
67<span class="w"> </span><span class="n">region</span><span class="p">:</span><span class="w"> </span><span class="n">Region</span><span class="p">.</span><span class="n">t</span><span class="p">,</span><span class="w"></span>\r
68<span class="w"> </span><span class="n">test</span><span class="p">:</span><span class="w"> </span><span class="n">Var</span><span class="p">.</span><span class="n">t</span><span class="p">,</span><span class="w"></span>\r
69<span class="w"> </span><span class="n">testType</span><span class="p">:</span><span class="w"> </span><span class="n">Type</span><span class="p">.</span><span class="n">t</span><span class="p">,</span><span class="w"></span>\r
70<span class="w"> </span><span class="n">tyconCons</span><span class="p">:</span><span class="w"> </span><span class="n">Tycon</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="p">{</span><span class="n">con</span><span class="p">:</span><span class="w"> </span><span class="n">Con</span><span class="p">.</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="n">hasArg</span><span class="p">:</span><span class="w"> </span><span class="n">bool</span><span class="p">}</span><span class="w"> </span><span class="n">vector</span><span class="p">}</span><span class="w"></span>\r
71<span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">Exp</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="p">((</span><span class="n">Layout</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">{</span><span class="n">isOnlyExns</span><span class="p">:</span><span class="w"> </span><span class="n">bool</span><span class="p">})</span><span class="w"> </span><span class="n">vector</span><span class="p">)</span><span class="w"> </span><span class="n">vector</span><span class="p">)</span><span class="w"></span>\r
72</pre></div></div></div>\r
73<div class="paragraph"><p><span class="monospaced">matchCompile</span> is complicated by the desire for modularity between the\r
74match compiler and its caller. Its caller is responsible for building\r
75the right hand side of a rule <span class="monospaced">p =&gt; e</span>. On the other hand, the match\r
76compiler is responsible for destructing the test and binding new\r
77variables to the components. In order to connect the new variables\r
78created by the match compiler with the variables in the pattern <span class="monospaced">p</span>,\r
79the match compiler passes an environment back to its caller that maps\r
80each variable in <span class="monospaced">p</span> to the corresponding variable introduced by the\r
81match compiler.</p></div>\r
82<div class="paragraph"><p>The match compiler builds a tree of n-way case expressions by working\r
83from outside to inside and left to right in the patterns. For example,</p></div>\r
84<div class="listingblock">\r
85<div class="content"><div class="highlight"><pre><span class="k">case</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
86<span class="w"> </span><span class="p">(_,</span><span class="w"> </span><span class="n">C1</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">e1</span><span class="w"></span>\r
87<span class="p">|</span><span class="w"> </span><span class="p">(</span><span class="n">C2</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">C3</span><span class="w"> </span><span class="n">c</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
88</pre></div></div></div>\r
89<div class="paragraph"><p>is translated to</p></div>\r
90<div class="listingblock">\r
91<div class="content"><div class="highlight"><pre><span class="k">let</span><span class="w"></span>\r
92<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f1</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">e1</span><span class="w"></span>\r
93<span class="w"> </span><span class="k">fun</span><span class="w"> </span><span class="n">f2</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
94<span class="k">in</span><span class="w"></span>\r
95<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
96<span class="w"> </span><span class="p">(</span><span class="n">x1</span><span class="p">,</span><span class="w"> </span><span class="n">x2</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"></span>\r
97<span class="w"> </span><span class="p">(</span><span class="k">case</span><span class="w"> </span><span class="n">x1</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
98<span class="w"> </span><span class="n">C2</span><span class="w"> </span><span class="n">b&#39;</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="k">case</span><span class="w"> </span><span class="n">x2</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
99<span class="w"> </span><span class="n">C1</span><span class="w"> </span><span class="n">a&#39;</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f1</span><span class="w"> </span><span class="n">a&#39;</span><span class="w"></span>\r
100<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">C3</span><span class="w"> </span><span class="n">c&#39;</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f2</span><span class="p">(</span><span class="n">b&#39;</span><span class="p">,</span><span class="n">c&#39;</span><span class="p">)</span><span class="w"></span>\r
101<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="n">Match</span><span class="p">)</span><span class="w"></span>\r
102<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="k">case</span><span class="w"> </span><span class="n">x2</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
103<span class="w"> </span><span class="n">C1</span><span class="w"> </span><span class="n">a_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">f1</span><span class="w"> </span><span class="n">a_</span><span class="w"></span>\r
104<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="n">Match</span><span class="p">))</span><span class="w"></span>\r
105<span class="k">end</span><span class="w"></span>\r
106</pre></div></div></div>\r
107<div class="paragraph"><p>Here you can see the necessity of abstracting out the ride hand sides\r
108of the cases in order to avoid code duplication. Right hand sides are\r
109always abstracted. The simplifier cleans things up. You can also see\r
110the new (primed) variables introduced by the match compiler and how\r
111the renaming works. Finally, you can see how the match compiler\r
112introduces the necessary default clauses in order to make a match\r
113exhaustive, i.e. cover all the cases.</p></div>\r
114<div class="paragraph"><p>The match compiler uses <span class="monospaced">numCons</span> and <span class="monospaced">tyconCons</span> to determine\r
115the exhaustivity of matches against constructors.</p></div>\r
116</div>\r
117</div>\r
118</div>\r
119<div id="footnotes"><hr></div>\r
120<div id="footer">\r
121<div id="footer-text">\r
122</div>\r
123<div id="footer-badges">\r
124</div>\r
125</div>\r
126</body>\r
127</html>\r