Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / UnresolvedBugs
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <meta name="generator" content="AsciiDoc 8.6.9">
6 <title>UnresolvedBugs</title>
7 <link rel="stylesheet" href="./asciidoc.css" type="text/css">
8 <link rel="stylesheet" href="./pygments.css" type="text/css">
9
10
11 <script type="text/javascript" src="./asciidoc.js"></script>
12 <script type="text/javascript">
13 /*<![CDATA[*/
14 asciidoc.install();
15 /*]]>*/
16 </script>
17 <link rel="stylesheet" href="./mlton.css" type="text/css">
18 </head>
19 <body class="article">
20 <div id="banner">
21 <div id="banner-home">
22 <a href="./Home">MLton 20180207</a>
23 </div>
24 </div>
25 <div id="header">
26 <h1>UnresolvedBugs</h1>
27 </div>
28 <div id="content">
29 <div id="preamble">
30 <div class="sectionbody">
31 <div class="paragraph"><p>Here are the places where MLton deviates from
32 <a href="DefinitionOfStandardML">The Definition of Standard ML (Revised)</a> and
33 the <a href="BasisLibrary">Basis Library</a>. In general, MLton complies with
34 the <a href="DefinitionOfStandardML">Definition</a> quite closely, typically much
35 more closely than other SML compilers (see, e.g., our list of
36 <a href="SMLNJDeviations">SML/NJ&#8217;s deviations</a>). In fact, the four deviations
37 listed here are the only known deviations, and we have no immediate
38 plans to fix them. If you find a deviation not listed here, please
39 report a <a href="Bug">Bug</a>.</p></div>
40 <div class="paragraph"><p>We don&#8217;t plan to fix these bugs because the first (parsing nested
41 cases) has historically never been accepted by any SML compiler, the
42 second clearly indicates a problem in the
43 <a href="DefinitionOfStandardML">Definition</a>, and the remaining are difficult
44 to resolve in the context of MLton&#8217;s implementaton of Standard ML (and
45 unlikely to be problematic in practice).</p></div>
46 <div class="ulist"><ul>
47 <li>
48 <p>
49 MLton does not correctly parse case expressions nested within other
50 matches. For example, the following fails.
51 </p>
52 <div class="listingblock">
53 <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="mi">0</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"></span>
54 <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>
55 <span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="mi">2</span><span class="w"></span>
56 <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="mi">3</span><span class="w"></span>
57 <span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">_</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">4</span><span class="w"></span>
58 </pre></div></div></div>
59 <div class="paragraph"><p>To do this in a program, simply parenthesize the case expression.</p></div>
60 <div class="paragraph"><p>Allowing such expressions, although compliant with the Definition,
61 would be a mistake, since using parentheses is clearer and no SML
62 compiler has ever allowed them. Furthermore, implementing this would
63 require serious yacc grammar rewriting followed by postprocessing.</p></div>
64 </li>
65 <li>
66 <p>
67 MLton does not raise the <span class="monospaced">Bind</span> exception at run time when
68 evaluating <span class="monospaced">val rec</span> (and <span class="monospaced">fun</span>) declarations that redefine
69 identifiers that previously had constructor status. (By default,
70 MLton does warn at compile time about <span class="monospaced">val rec</span> (and <span class="monospaced">fun</span>)
71 declarations that redefine identifiers that previously had
72 constructors status; see the <span class="monospaced">valrecConstr</span> <a href="MLBasisAnnotations">ML
73 Basis annotation</a>.) For example, the Definition requires the
74 following program to type check, but also (bizarelly) requires it to
75 raise the <span class="monospaced">Bind</span> exception
76 </p>
77 <div class="listingblock">
78 <div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="k">rec</span><span class="w"> </span><span class="n">NONE</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">fn</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="w"></span>
79 </pre></div></div></div>
80 <div class="paragraph"><p>The Definition&#8217;s behavior is obviously an error, a mismatch between
81 the static semantics (rule 26) and the dynamic semantics (rule 126).
82 Given the comments on rule 26 in the Definition, it seems clear that
83 the authors meant for <span class="monospaced">val rec</span> to allow an identifier&#8217;s constructor
84 status to be overridden both statically and dynamically. Hence, MLton
85 and most SML compilers follow rule 26, but do not follow rule 126.</p></div>
86 </li>
87 <li>
88 <p>
89 MLton does not hide the equality aspect of types declared in
90 <span class="monospaced">abstype</span> declarations. So, MLton accepts programs like the following,
91 while the Definition rejects them.
92 </p>
93 <div class="listingblock">
94 <div class="content"><div class="highlight"><pre><span class="k">abstype</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">T</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="k">end</span><span class="w"></span>
95 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">t1</span><span class="p">,</span><span class="w"> </span><span class="n">t2</span><span class="w"> </span><span class="p">:</span><span class="w"> </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">t1</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">t2</span><span class="w"></span>
96
97 <span class="k">abstype</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">T</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="k">val</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">T</span><span class="w"> </span><span class="k">end</span><span class="w"></span>
98 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</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">a</span><span class="w"></span>
99 </pre></div></div></div>
100 <div class="paragraph"><p>One consequence of this choice is that MLton accepts the following
101 program, in accordance with the Definition.</p></div>
102 <div class="listingblock">
103 <div class="content"><div class="highlight"><pre><span class="k">abstype</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">T</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">eq</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">end</span><span class="w"></span>
104 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">(</span><span class="n">t1</span><span class="p">,</span><span class="w"> </span><span class="n">t2</span><span class="w"> </span><span class="p">:</span><span class="w"> </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">eq</span><span class="w"> </span><span class="p">(</span><span class="n">t1</span><span class="p">,</span><span class="w"> </span><span class="n">t2</span><span class="p">)</span><span class="w"></span>
105 </pre></div></div></div>
106 <div class="paragraph"><p>Other implementations will typically reject this program, because they
107 make an early choice for the type of <span class="monospaced">eq</span> to be <span class="monospaced">''a * ''a -&gt; bool</span>
108 instead of <span class="monospaced">t * t -&gt; bool</span>. The choice is understandable, since the
109 Definition accepts the following program.</p></div>
110 <div class="listingblock">
111 <div class="content"><div class="highlight"><pre><span class="k">abstype</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">T</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">eq</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">end</span><span class="w"></span>
112 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">eq</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"></span>
113 </pre></div></div></div>
114 </li>
115 <li>
116 <p>
117 MLton (re-)type checks each functor definition at every
118 corresponding functor application (the compilation technique of
119 defunctorization). One consequence of this implementation is that
120 MLton accepts the following program, while the Definition rejects
121 it.
122 </p>
123 <div class="listingblock">
124 <div class="content"><div class="highlight"><pre><span class="k">functor</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="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">struct</span><span class="w"></span>
125 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="n">id</span><span class="w"></span>
126 <span class="k">end</span><span class="w"></span>
127 <span class="k">structure</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">F</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><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><span class="k">end</span><span class="p">)</span><span class="w"></span>
128 <span class="k">structure</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><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">bool</span><span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"></span>
129 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">f</span><span class="w"> </span><span class="mi">10</span><span class="w"></span>
130 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">B</span><span class="p">.</span><span class="n">f</span><span class="w"> </span><span class="s">&quot;dude&quot;</span><span class="w"></span>
131 </pre></div></div></div>
132 <div class="paragraph"><p>On the other hand, other implementations will typically reject the
133 following program, while MLton and the Definition accept it.</p></div>
134 <div class="listingblock">
135 <div class="content"><div class="highlight"><pre><span class="k">functor</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="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">struct</span><span class="w"></span>
136 <span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="n">id</span><span class="w"></span>
137 <span class="k">end</span><span class="w"></span>
138 <span class="k">structure</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">F</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><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><span class="k">end</span><span class="p">)</span><span class="w"></span>
139 <span class="k">structure</span><span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><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">bool</span><span class="w"> </span><span class="k">end</span><span class="p">)</span><span class="w"></span>
140 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">f</span><span class="w"> </span><span class="mi">10</span><span class="w"></span>
141 <span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">B</span><span class="p">.</span><span class="n">f</span><span class="w"> </span><span class="n">false</span><span class="w"></span>
142 </pre></div></div></div>
143 <div class="paragraph"><p>See <a href="References#DreyerBlume07">DreyerBlume07</a> for more details.</p></div>
144 </li>
145 </ul></div>
146 </div>
147 </div>
148 </div>
149 <div id="footnotes"><hr></div>
150 <div id="footer">
151 <div id="footer-text">
152 </div>
153 <div id="footer-badges">
154 </div>
155 </div>
156 </body>
157 </html>