Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / SMLNJDeviations
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>SMLNJDeviations</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>SMLNJDeviations</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>Here are some deviations of <a href="SMLNJ">SML/NJ</a> from\r
32<a href="DefinitionOfStandardML">The Definition of Standard ML (Revised)</a>.\r
33Some of these are documented in the\r
34<a href="http://www.smlnj.org/doc/Conversion/index.html">SML '97 Conversion Guide</a>.\r
35Since MLton does not deviate from the Definition, you should look here\r
36if you are having trouble porting a program from MLton to SML/NJ or\r
37vice versa. If you discover other deviations of SML/NJ that aren&#8217;t\r
38listed here, please send mail to\r
39<a href="mailto:MLton-devel@mlton.org"><span class="monospaced">MLton-devel@mlton.org</span></a>.</p></div>\r
40<div class="ulist"><ul>\r
41<li>\r
42<p>\r
43SML/NJ allows spaces in long identifiers, as in <span class="monospaced">S . x</span>. Section\r
442.5 of the Definition implies that <span class="monospaced">S . x</span> should be treated as three\r
45separate lexical items.\r
46</p>\r
47</li>\r
48<li>\r
49<p>\r
50SML/NJ allows <span class="monospaced">op</span> to appear in <span class="monospaced">val</span> specifications:\r
51</p>\r
52<div class="listingblock">\r
53<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">FOO</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
54<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="n">+</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">int</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">int</span><span class="w"></span>\r
55<span class="k">end</span><span class="w"></span>\r
56</pre></div></div></div>\r
57<div class="paragraph"><p>The grammar on page 14 of the Definition does not allow it. Recent\r
58versions of SML/NJ do give a warning.</p></div>\r
59</li>\r
60<li>\r
61<p>\r
62SML/NJ rejects\r
63</p>\r
64<div class="listingblock">\r
65<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="k">op</span><span class="w"> </span><span class="n">*</span><span class="p">)</span><span class="w"></span>\r
66</pre></div></div></div>\r
67<div class="paragraph"><p>as an unmatched close comment.</p></div>\r
68</li>\r
69<li>\r
70<p>\r
71SML/NJ allows <span class="monospaced">=</span> to be rebound by the declaration:\r
72</p>\r
73<div class="listingblock">\r
74<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
75</pre></div></div></div>\r
76<div class="paragraph"><p>This is explicitly forbidden on page 5 of the Definition. Recent\r
77versions of SML/NJ do give a warning.</p></div>\r
78</li>\r
79<li>\r
80<p>\r
81SML/NJ allows rebinding <span class="monospaced">true</span>, <span class="monospaced">false</span>, <span class="monospaced">nil</span>, <span class="monospaced">::</span>, and <span class="monospaced">ref</span> by\r
82the declarations:\r
83</p>\r
84<div class="listingblock">\r
85<div class="content"><div class="highlight"><pre><span class="k">fun</span><span class="w"> </span><span class="n">true</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
86<span class="k">fun</span><span class="w"> </span><span class="n">false</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
87<span class="k">fun</span><span class="w"> </span><span class="n">nil</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
88<span class="k">fun</span><span class="w"> </span><span class="k">op</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
89<span class="k">fun</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
90</pre></div></div></div>\r
91<div class="paragraph"><p>This is explicitly forbidden on page 9 of the Definition.</p></div>\r
92</li>\r
93<li>\r
94<p>\r
95SML/NJ extends the syntax of the language to allow vector\r
96expressions and patterns like the following:\r
97</p>\r
98<div class="listingblock">\r
99<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">#[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span><span class="w"></span>\r
100<span class="k">val</span><span class="w"> </span><span class="p">#[</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">v</span><span class="w"></span>\r
101</pre></div></div></div>\r
102<div class="paragraph"><p>MLton supports vector expressions and patterns with the <a href="SuccessorML#VectorExpsAndPats"><span class="monospaced">allowVectorExpsAndPats</span></a> <a href="MLBasisAnnotations">ML Basis annotation</a>.</p></div>\r
103</li>\r
104<li>\r
105<p>\r
106SML/NJ extends the syntax of the language to allow <em>or patterns</em>\r
107like the following:\r
108</p>\r
109<div class="listingblock">\r
110<div class="content"><div class="highlight"><pre><span class="k">datatype</span><span class="w"> </span><span class="n">foo</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Foo</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">Bar</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">int</span><span class="w"></span>\r
111<span class="k">val</span><span class="w"> </span><span class="p">(</span><span class="n">Foo</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">Bar</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Foo</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
112</pre></div></div></div>\r
113<div class="paragraph"><p>MLton supports or patterns with the <a href="SuccessorML#OrPats"><span class="monospaced">allowOrPats</span></a> <a href="MLBasisAnnotations">ML Basis annotation</a>.</p></div>\r
114</li>\r
115<li>\r
116<p>\r
117SML/NJ allows higher-order functors, that is, functors can be\r
118components of structures and can be passed as functor arguments and\r
119returned as functor results. As a consequence, SML/NJ allows\r
120abbreviated functor definitions, as in the following:\r
121</p>\r
122<div class="listingblock">\r
123<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
124<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
125<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
126<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
127<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
128<span class="k">functor</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="p">(</span><span class="k">structure</span><span class="w"> </span><span class="n">A</span><span class="p">:</span><span class="w"> </span><span class="n">S</span><span class="p">):</span><span class="w"> </span><span class="n">S</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
129<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
130<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">A</span><span class="p">.</span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">t</span><span class="w"></span>\r
131<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="p">(</span><span class="n">A</span><span class="p">.</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">x</span><span class="p">)</span><span class="w"></span>\r
132<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
133<span class="k">functor</span><span class="w"> </span><span class="n">G</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">F</span><span class="w"></span>\r
134</pre></div></div></div>\r
135</li>\r
136<li>\r
137<p>\r
138SML/NJ extends the syntax of the language to allow <span class="monospaced">functor</span> and\r
139<span class="monospaced">signature</span> declarations to occur within the scope of <span class="monospaced">local</span> and\r
140<span class="monospaced">structure</span> declarations.\r
141</p>\r
142</li>\r
143<li>\r
144<p>\r
145SML/NJ allows duplicate type specifications in signatures when the\r
146duplicates are introduced by <span class="monospaced">include</span>, as in the following:\r
147</p>\r
148<div class="listingblock">\r
149<div class="content"><div class="highlight"><pre><span class="k">signature</span><span class="w"> </span><span class="n">SIG1</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
150<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
151<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
152<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"></span>\r
153<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
154<span class="k">signature</span><span class="w"> </span><span class="n">SIG2</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
155<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
156<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
157<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">v</span><span class="w"></span>\r
158<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
159<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
160<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
161<span class="w"> </span><span class="k">include</span><span class="w"> </span><span class="n">SIG1</span><span class="w"></span>\r
162<span class="w"> </span><span class="k">include</span><span class="w"> </span><span class="n">SIG2</span><span class="w"></span>\r
163<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
164</pre></div></div></div>\r
165<div class="paragraph"><p>This is disallowed by rule 77 of the Definition.</p></div>\r
166</li>\r
167<li>\r
168<p>\r
169SML/NJ allows sharing constraints between type abbreviations in\r
170signatures, as in the following:\r
171</p>\r
172<div class="listingblock">\r
173<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
174<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
175<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="n">*</span><span class="w"> </span><span class="n">int</span><span class="w"></span>\r
176<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">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">int</span><span class="w"></span>\r
177<span class="w"> </span><span class="k">sharing</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">u</span><span class="w"></span>\r
178<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
179</pre></div></div></div>\r
180<div class="paragraph"><p>These are disallowed by rule 78 of the Definition. Recent versions of\r
181SML/NJ correctly disallow sharing constraints between type\r
182abbreviations in signatures.</p></div>\r
183</li>\r
184<li>\r
185<p>\r
186SML/NJ disallows multiple <span class="monospaced">where type</span> specifications of the same\r
187type name, as in the following\r
188</p>\r
189<div class="listingblock">\r
190<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
191<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
192<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
193<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
194<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
195<span class="w"> </span><span class="k">where</span><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">int</span><span class="w"></span>\r
196</pre></div></div></div>\r
197<div class="paragraph"><p>This is allowed by rule 64 of the Definition.</p></div>\r
198</li>\r
199<li>\r
200<p>\r
201SML/NJ allows <span class="monospaced">and</span> in <span class="monospaced">sharing</span> specs in signatures, as in\r
202</p>\r
203<div class="listingblock">\r
204<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
205<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
206<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
207<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">u</span><span class="w"></span>\r
208<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">v</span><span class="w"></span>\r
209<span class="w"> </span><span class="k">sharing</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">u</span><span class="w"></span>\r
210<span class="w"> </span><span class="k">and</span><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">v</span><span class="w"></span>\r
211<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
212</pre></div></div></div>\r
213</li>\r
214<li>\r
215<p>\r
216SML/NJ does not expand the <span class="monospaced">withtype</span> derived form as described by\r
217the Definition. According to page 55 of the Definition, the type\r
218bindings of a <span class="monospaced">withtype</span> declaration are substituted simultaneously in\r
219the connected datatype. Consider the following program.\r
220</p>\r
221<div class="listingblock">\r
222<div class="content"><div class="highlight"><pre><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">real</span><span class="w"> </span><span class="p">;</span><span class="w"></span>\r
223<span class="k">datatype</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
224<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">t</span><span class="w"></span>\r
225<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">u</span><span class="w"></span>\r
226<span class="k">withtype</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>\r
227<span class="k">and</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">u</span><span class="w"></span>\r
228</pre></div></div></div>\r
229<div class="paragraph"><p>According to the Definition, it should be expanded to the following.</p></div>\r
230<div class="listingblock">\r
231<div class="content"><div class="highlight"><pre><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">real</span><span class="w"> </span><span class="p">;</span><span class="w"></span>\r
232<span class="k">datatype</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
233<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">u</span><span class="w"></span>\r
234<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">int</span><span class="w"> </span><span class="p">;</span><span class="w"></span>\r
235<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">int</span><span class="w"></span>\r
236<span class="k">and</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">u</span><span class="w"></span>\r
237</pre></div></div></div>\r
238<div class="paragraph"><p>However, SML/NJ expands <span class="monospaced">withtype</span> bindings sequentially, meaning that\r
239earlier bindings are expanded within later ones. Hence, the above\r
240program is expanded to the following.</p></div>\r
241<div class="listingblock">\r
242<div class="content"><div class="highlight"><pre><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">real</span><span class="w"> </span><span class="p">;</span><span class="w"></span>\r
243<span class="k">datatype</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
244<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>\r
245<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">int</span><span class="w"> </span><span class="p">;</span><span class="w"></span>\r
246<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">int</span><span class="w"></span>\r
247<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
248</pre></div></div></div>\r
249</li>\r
250<li>\r
251<p>\r
252SML/NJ allows <span class="monospaced">withtype</span> specifications in signatures.\r
253</p>\r
254<div class="paragraph"><p>MLton supports <span class="monospaced">withtype</span> specifications in signatures with the <a href="SuccessorML#SigWithtype"><span class="monospaced">allowSigWithtype</span></a> <a href="MLBasisAnnotations">ML Basis annotation</a>.</p></div>\r
255</li>\r
256<li>\r
257<p>\r
258SML/NJ allows a <span class="monospaced">where</span> structure specification that is similar to a\r
259<span class="monospaced">where type</span> specification. For example:\r
260</p>\r
261<div class="listingblock">\r
262<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><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="w"></span>\r
263<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
264<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
265<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </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="w"></span>\r
266<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="k">where</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">S</span><span class="w"></span>\r
267</pre></div></div></div>\r
268<div class="paragraph"><p>This is equivalent to:</p></div>\r
269<div class="listingblock">\r
270<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><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="w"></span>\r
271<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
272<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
273<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </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="w"></span>\r
274<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">T</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">t</span><span class="w"></span>\r
275</pre></div></div></div>\r
276<div class="paragraph"><p>SML/NJ also allows a definitional structure specification that is\r
277similar to a definitional type specification. For example:</p></div>\r
278<div class="listingblock">\r
279<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><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="w"></span>\r
280<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
281<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
282<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </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="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">S</span><span class="w"></span>\r
283<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
284</pre></div></div></div>\r
285<div class="paragraph"><p>This is equivalent to the previous examples and to:</p></div>\r
286<div class="listingblock">\r
287<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><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="w"></span>\r
288<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
289<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
290<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</span><span class="w"> </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="w"> </span><span class="k">where</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">S</span><span class="p">.</span><span class="n">t</span><span class="w"></span>\r
291<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
292</pre></div></div></div>\r
293</li>\r
294<li>\r
295<p>\r
296SML/NJ disallows binding non-datatypes with datatype replication.\r
297For example, it rejects the following program that should be allowed\r
298according to the Definition.\r
299</p>\r
300<div class="listingblock">\r
301<div class="content"><div class="highlight"><pre><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</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="n">&#39;a</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;b</span><span class="w"></span>\r
302<span class="k">datatype</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">datatype</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
303</pre></div></div></div>\r
304<div class="paragraph"><p>This idiom can be useful when one wants to rename a type without\r
305rewriting all the type arguments. For example, the above would have\r
306to be written in SML/NJ as follows.</p></div>\r
307<div class="listingblock">\r
308<div class="content"><div class="highlight"><pre><span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</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="n">&#39;a</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">&#39;b</span><span class="w"></span>\r
309<span class="k">type</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">)</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="n">&#39;a</span><span class="p">,</span><span class="w"> </span><span class="n">&#39;b</span><span class="p">)</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
310</pre></div></div></div>\r
311</li>\r
312<li>\r
313<p>\r
314SML/NJ disallows sharing a structure with one of its substructures.\r
315For example, SML/NJ disallows the following.\r
316</p>\r
317<div class="listingblock">\r
318<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
319<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
320<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">S</span><span class="p">:</span><span class="w"></span>\r
321<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
322<span class="w"> </span><span class="k">type</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
323<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">T</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="w"></span>\r
324<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
325<span class="w"> </span><span class="k">sharing</span><span class="w"> </span><span class="n">S</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>\r
326<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
327</pre></div></div></div>\r
328<div class="paragraph"><p>This signature is allowed by the Definition.</p></div>\r
329</li>\r
330<li>\r
331<p>\r
332SML/NJ disallows polymorphic generalization of refutable\r
333patterns. For example, SML/NJ disallows the following.\r
334</p>\r
335<div class="listingblock">\r
336<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[[]]</span><span class="w"></span>\r
337<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="p">(</span><span class="mi">1</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;one&quot;</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"></span>\r
338</pre></div></div></div>\r
339<div class="paragraph"><p>Recent versions of SML/NJ correctly allow polymorphic generalization\r
340of refutable patterns.</p></div>\r
341</li>\r
342<li>\r
343<p>\r
344SML/NJ uses an overly restrictive context for type inference. For\r
345example, SML/NJ rejects both of the following.\r
346</p>\r
347<div class="listingblock">\r
348<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
349<span class="k">struct</span><span class="w"></span>\r
350<span class="w"> </span><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="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">[]</span><span class="w"></span>\r
351<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">z</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="p">[</span><span class="n">true</span><span class="p">]</span><span class="w"> </span><span class="n">::</span><span class="w"> </span><span class="n">nil</span><span class="w"></span>\r
352<span class="k">end</span><span class="w"></span>\r
353</pre></div></div></div>\r
354<div class="listingblock">\r
355<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><span class="k">sig</span><span class="w"> </span><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">bool</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
356<span class="k">struct</span><span class="w"></span>\r
357<span class="w"> </span><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="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">[]</span><span class="w"></span>\r
358<span class="k">end</span><span class="w"></span>\r
359</pre></div></div></div>\r
360<div class="paragraph"><p>These structures are allowed by the Definition.</p></div>\r
361</li>\r
362</ul></div>\r
363</div>\r
364</div>\r
365<div class="sect1">\r
366<h2 id="_deviations_from_the_basis_library_specification">Deviations from the Basis Library Specification</h2>\r
367<div class="sectionbody">\r
368<div class="paragraph"><p>Here are some deviations of SML/NJ from the <a href="BasisLibrary">Basis Library</a>\r
369<a href="http://www.standardml.org/Basis">specification</a>.</p></div>\r
370<div class="ulist"><ul>\r
371<li>\r
372<p>\r
373SML/NJ exposes the equality of the <span class="monospaced">vector</span> type in structures such\r
374as <span class="monospaced">Word8Vector</span> that abstractly match <span class="monospaced">MONO_VECTOR</span>, which says\r
375<span class="monospaced">type vector</span>, not <span class="monospaced">eqtype vector</span>. So, for example, SML/NJ accepts\r
376the following program:\r
377</p>\r
378<div class="listingblock">\r
379<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="p">(</span><span class="n">v</span><span class="p">:</span><span class="w"> </span><span class="n">Word8Vector</span><span class="p">.</span><span class="n">vector</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">v</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">v</span><span class="w"></span>\r
380</pre></div></div></div>\r
381</li>\r
382<li>\r
383<p>\r
384SML/NJ exposes the equality property of the type <span class="monospaced">status</span> in\r
385<span class="monospaced">OS.Process</span>. This means that programs which directly compare two\r
386values of type <span class="monospaced">status</span> will work with SML/NJ but not MLton.\r
387</p>\r
388</li>\r
389<li>\r
390<p>\r
391Under SML/NJ on Windows, <span class="monospaced">OS.Path.validVolume</span> incorrectly considers\r
392absolute empty volumes to be valid. In other words, when the\r
393expression\r
394</p>\r
395<div class="listingblock">\r
396<div class="content"><div class="highlight"><pre><span class="n">OS</span><span class="p">.</span><span class="n">Path</span><span class="p">.</span><span class="n">validVolume</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">isAbs</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">true</span><span class="p">,</span><span class="w"> </span><span class="n">vol</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="w"> </span><span class="p">}</span><span class="w"></span>\r
397</pre></div></div></div>\r
398<div class="paragraph"><p>is evaluated by SML/NJ on Windows, the result is <span class="monospaced">true</span>. MLton, on\r
399the other hand, correctly follows the Basis Library Specification,\r
400which states that on Windows, <span class="monospaced">OS.Path.validVolume</span> should return\r
401<span class="monospaced">false</span> whenever <span class="monospaced">isAbs = true</span> and <span class="monospaced">vol = ""</span>.</p></div>\r
402<div class="paragraph"><p>This incorrect behavior causes other <span class="monospaced">OS.Path</span> functions to behave\r
403differently. For example, when the expression</p></div>\r
404<div class="listingblock">\r
405<div class="content"><div class="highlight"><pre><span class="n">OS</span><span class="p">.</span><span class="n">Path</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="p">(</span><span class="n">OS</span><span class="p">.</span><span class="n">Path</span><span class="p">.</span><span class="n">fromString</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\\</span><span class="s">usr</span><span class="se">\\</span><span class="s">local&quot;</span><span class="p">)</span><span class="w"></span>\r
406</pre></div></div></div>\r
407<div class="paragraph"><p>is evaluated by SML/NJ on Windows, the result is <span class="monospaced">"\\usr\\local"</span>,\r
408whereas under MLton on Windows, evaluating this expression (correctly)\r
409causes an <span class="monospaced">OS.Path.Path</span> exception to be raised.</p></div>\r
410</li>\r
411</ul></div>\r
412</div>\r
413</div>\r
414</div>\r
415<div id="footnotes"><hr></div>\r
416<div id="footer">\r
417<div id="footer-text">\r
418</div>\r
419<div id="footer-badges">\r
420</div>\r
421</div>\r
422</body>\r
423</html>\r