Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / SyntacticConventions
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>SyntacticConventions</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(2);\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>SyntacticConventions</h1>\r
27<div id="toc">
28 <div id="toctitle">Table of Contents</div>
29 <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
30</div>\r
31</div>\r
32<div id="content">\r
33<div id="preamble">\r
34<div class="sectionbody">\r
35<div class="paragraph"><p>Here are a number of syntactic conventions useful for programming in\r
36SML.</p></div>\r
37</div>\r
38</div>\r
39<div class="sect1">\r
40<h2 id="_general">General</h2>\r
41<div class="sectionbody">\r
42<div class="ulist"><ul>\r
43<li>\r
44<p>\r
45A line of code never exceeds 80 columns.\r
46</p>\r
47</li>\r
48<li>\r
49<p>\r
50Only split a syntactic entity across multiple lines if it doesn&#8217;t fit on one line within 80 columns.\r
51</p>\r
52</li>\r
53<li>\r
54<p>\r
55Use alphabetical order wherever possible.\r
56</p>\r
57</li>\r
58<li>\r
59<p>\r
60Avoid redundant parentheses.\r
61</p>\r
62</li>\r
63<li>\r
64<p>\r
65When using <span class="monospaced">:</span>, there is no space before the colon, and a single space after it.\r
66</p>\r
67</li>\r
68</ul></div>\r
69</div>\r
70</div>\r
71<div class="sect1">\r
72<h2 id="_identifiers">Identifiers</h2>\r
73<div class="sectionbody">\r
74<div class="ulist"><ul>\r
75<li>\r
76<p>\r
77Variables, record labels and type constructors begin with and use\r
78small letters, using capital letters to separate words.\r
79</p>\r
80<div class="listingblock">\r
81<div class="content"><div class="highlight"><pre><span class="n">cost</span><span class="w"></span>\r
82<span class="n">maxValue</span><span class="w"></span>\r
83</pre></div></div></div>\r
84</li>\r
85<li>\r
86<p>\r
87Variables that represent collections of objects (lists, arrays,\r
88vectors, &#8230;) are often suffixed with an <span class="monospaced">s</span>.\r
89</p>\r
90<div class="listingblock">\r
91<div class="content"><div class="highlight"><pre><span class="n">xs</span><span class="w"></span>\r
92<span class="n">employees</span><span class="w"></span>\r
93</pre></div></div></div>\r
94</li>\r
95<li>\r
96<p>\r
97Constructors, structure identifiers, and functor identifiers begin\r
98with a capital letter.\r
99</p>\r
100<div class="listingblock">\r
101<div class="content"><div class="highlight"><pre><span class="n">Queue</span><span class="w"></span>\r
102<span class="n">LinkedList</span><span class="w"></span>\r
103</pre></div></div></div>\r
104</li>\r
105<li>\r
106<p>\r
107Signature identifiers are in all capitals, using <span class="monospaced">_</span> to separate\r
108words.\r
109</p>\r
110<div class="listingblock">\r
111<div class="content"><div class="highlight"><pre><span class="n">LIST</span><span class="w"></span>\r
112<span class="n">BINARY_HEAP</span><span class="w"></span>\r
113</pre></div></div></div>\r
114</li>\r
115</ul></div>\r
116</div>\r
117</div>\r
118<div class="sect1">\r
119<h2 id="_types">Types</h2>\r
120<div class="sectionbody">\r
121<div class="ulist"><ul>\r
122<li>\r
123<p>\r
124Alphabetize record labels. In a record type, there are spaces after\r
125colons and commas, but not before colons or commas, or at the\r
126delimiters <span class="monospaced">{</span> and <span class="monospaced">}</span>.\r
127</p>\r
128<div class="listingblock">\r
129<div class="content"><div class="highlight"><pre><span class="p">{</span><span class="n">bar</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="p">,</span><span class="w"> </span><span class="n">foo</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="p">}</span><span class="w"></span>\r
130</pre></div></div></div>\r
131</li>\r
132<li>\r
133<p>\r
134Only split a record type across multiple lines if it doesn&#8217;t fit on\r
135one line. If a record type must be split over multiple lines, put one\r
136field per line.\r
137</p>\r
138<div class="listingblock">\r
139<div class="content"><div class="highlight"><pre><span class="p">{</span><span class="n">bar</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="p">,</span><span class="w"></span>\r
140<span class="w"> </span><span class="n">foo</span><span class="p">:</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">real</span><span class="p">,</span><span class="w"></span>\r
141<span class="w"> </span><span class="n">zoo</span><span class="p">:</span><span class="w"> </span><span class="n">bool</span><span class="p">}</span><span class="w"></span>\r
142</pre></div></div></div>\r
143</li>\r
144<li>\r
145<p>\r
146In a tuple type, there are spaces before and after each <span class="monospaced">*</span>.\r
147</p>\r
148<div class="listingblock">\r
149<div class="content"><div class="highlight"><pre><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">bool</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">real</span><span class="w"></span>\r
150</pre></div></div></div>\r
151</li>\r
152<li>\r
153<p>\r
154Only split a tuple type across multiple lines if it doesn&#8217;t fit on\r
155one line. In a tuple type split over multiple lines, there is one\r
156type per line, and the <span class="monospaced">*</span>-s go at the beginning of the lines.\r
157</p>\r
158<div class="listingblock">\r
159<div class="content"><div class="highlight"><pre><span class="n">int</span><span class="w"></span>\r
160<span class="n">*</span><span class="w"> </span><span class="n">bool</span><span class="w"></span>\r
161<span class="n">*</span><span class="w"> </span><span class="n">real</span><span class="w"></span>\r
162</pre></div></div></div>\r
163<div class="paragraph"><p>It may also be useful to parenthesize to make the grouping more\r
164apparent.</p></div>\r
165<div class="listingblock">\r
166<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">int</span><span class="w"></span>\r
167<span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">bool</span><span class="w"></span>\r
168<span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">real</span><span class="p">)</span><span class="w"></span>\r
169</pre></div></div></div>\r
170</li>\r
171<li>\r
172<p>\r
173In an arrow type split over multiple lines, put the arrow at the\r
174beginning of its line.\r
175</p>\r
176<div class="listingblock">\r
177<div class="content"><div class="highlight"><pre><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">real</span><span class="w"></span>\r
178<span class="p">-&gt;</span><span class="w"> </span><span class="n">bool</span><span class="w"></span>\r
179</pre></div></div></div>\r
180<div class="paragraph"><p>It may also be useful to parenthesize to make the grouping more\r
181apparent.</p></div>\r
182<div class="listingblock">\r
183<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">real</span><span class="w"></span>\r
184<span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">bool</span><span class="p">)</span><span class="w"></span>\r
185</pre></div></div></div>\r
186</li>\r
187<li>\r
188<p>\r
189Avoid redundant parentheses.\r
190</p>\r
191</li>\r
192<li>\r
193<p>\r
194Arrow types associate to the right, so write\r
195</p>\r
196<div class="listingblock">\r
197<div class="content"><div class="highlight"><pre><span class="n">a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">c</span><span class="w"></span>\r
198</pre></div></div></div>\r
199<div class="paragraph"><p>not</p></div>\r
200<div class="listingblock">\r
201<div class="content"><div class="highlight"><pre><span class="n">a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">c</span><span class="p">)</span><span class="w"></span>\r
202</pre></div></div></div>\r
203</li>\r
204<li>\r
205<p>\r
206Type constructor application associates to the left, so write\r
207</p>\r
208<div class="listingblock">\r
209<div class="content"><div class="highlight"><pre><span class="n">int</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="n">list</span><span class="w"></span>\r
210</pre></div></div></div>\r
211<div class="paragraph"><p>not</p></div>\r
212<div class="listingblock">\r
213<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">int</span><span class="w"> </span><span class="n">ref</span><span class="p">)</span><span class="w"> </span><span class="n">list</span><span class="w"></span>\r
214</pre></div></div></div>\r
215</li>\r
216<li>\r
217<p>\r
218Type constructor application binds more tightly than a tuple type,\r
219so write\r
220</p>\r
221<div class="listingblock">\r
222<div class="content"><div class="highlight"><pre><span class="n">int</span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">bool</span><span class="w"> </span><span class="n">list</span><span class="w"></span>\r
223</pre></div></div></div>\r
224<div class="paragraph"><p>not</p></div>\r
225<div class="listingblock">\r
226<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">int</span><span class="w"> </span><span class="n">list</span><span class="p">)</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="p">(</span><span class="n">bool</span><span class="w"> </span><span class="n">list</span><span class="p">)</span><span class="w"></span>\r
227</pre></div></div></div>\r
228</li>\r
229<li>\r
230<p>\r
231Tuple types bind more tightly than arrow types, so write\r
232</p>\r
233<div class="listingblock">\r
234<div class="content"><div class="highlight"><pre><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">bool</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">real</span><span class="w"></span>\r
235</pre></div></div></div>\r
236<div class="paragraph"><p>not</p></div>\r
237<div class="listingblock">\r
238<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">int</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">bool</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">real</span><span class="w"></span>\r
239</pre></div></div></div>\r
240</li>\r
241</ul></div>\r
242</div>\r
243</div>\r
244<div class="sect1">\r
245<h2 id="_core">Core</h2>\r
246<div class="sectionbody">\r
247<div class="ulist"><ul>\r
248<li>\r
249<p>\r
250A core expression or declaration split over multiple lines does not\r
251contain any blank lines.\r
252</p>\r
253</li>\r
254<li>\r
255<p>\r
256A record field selector has no space between the <span class="monospaced">#</span> and the record\r
257label. So, write\r
258</p>\r
259<div class="listingblock">\r
260<div class="content"><div class="highlight"><pre><span class="p">#</span><span class="n">foo</span><span class="w"></span>\r
261</pre></div></div></div>\r
262<div class="paragraph"><p>not</p></div>\r
263<div class="listingblock">\r
264<div class="content"><div class="highlight"><pre><span class="p">#</span><span class="w"> </span><span class="n">foo</span><span class="w"></span>\r
265</pre></div></div></div>\r
266</li>\r
267<li>\r
268<p>\r
269A tuple has a space after each comma, but not before, and not at the\r
270delimiters <span class="monospaced">(</span> and <span class="monospaced">)</span>.\r
271</p>\r
272<div class="listingblock">\r
273<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">e1</span><span class="p">,</span><span class="w"> </span><span class="n">e2</span><span class="p">,</span><span class="w"> </span><span class="n">e3</span><span class="p">)</span><span class="w"></span>\r
274</pre></div></div></div>\r
275</li>\r
276<li>\r
277<p>\r
278A tuple split over multiple lines has one element per line, and the\r
279commas go at the end of the lines.\r
280</p>\r
281<div class="listingblock">\r
282<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">e1</span><span class="p">,</span><span class="w"></span>\r
283<span class="w"> </span><span class="n">e2</span><span class="p">,</span><span class="w"></span>\r
284<span class="w"> </span><span class="n">e3</span><span class="p">)</span><span class="w"></span>\r
285</pre></div></div></div>\r
286</li>\r
287<li>\r
288<p>\r
289A list has a space after each comma, but not before, and not at the\r
290delimiters <span class="monospaced">[</span> and <span class="monospaced">]</span>.\r
291</p>\r
292<div class="listingblock">\r
293<div class="content"><div class="highlight"><pre><span class="p">[</span><span class="n">e1</span><span class="p">,</span><span class="w"> </span><span class="n">e2</span><span class="p">,</span><span class="w"> </span><span class="n">e3</span><span class="p">]</span><span class="w"></span>\r
294</pre></div></div></div>\r
295</li>\r
296<li>\r
297<p>\r
298A list split over multiple lines has one element per line, and the\r
299commas at the end of the lines.\r
300</p>\r
301<div class="listingblock">\r
302<div class="content"><div class="highlight"><pre><span class="p">[</span><span class="n">e1</span><span class="p">,</span><span class="w"></span>\r
303<span class="w"> </span><span class="n">e2</span><span class="p">,</span><span class="w"></span>\r
304<span class="w"> </span><span class="n">e3</span><span class="p">]</span><span class="w"></span>\r
305</pre></div></div></div>\r
306</li>\r
307<li>\r
308<p>\r
309A record has spaces before and after <span class="monospaced">=</span>, a space after each comma,\r
310but not before, and not at the delimiters <span class="monospaced">{</span> and <span class="monospaced">}</span>. Field names\r
311appear in alphabetical order.\r
312</p>\r
313<div class="listingblock">\r
314<div class="content"><div class="highlight"><pre><span class="p">{</span><span class="n">bar</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><span class="n">foo</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>\r
315</pre></div></div></div>\r
316</li>\r
317<li>\r
318<p>\r
319A sequence expression has a space after each semicolon, but not before.\r
320</p>\r
321<div class="listingblock">\r
322<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">e1</span><span class="p">;</span><span class="w"> </span><span class="n">e2</span><span class="p">;</span><span class="w"> </span><span class="n">e3</span><span class="p">)</span><span class="w"></span>\r
323</pre></div></div></div>\r
324</li>\r
325<li>\r
326<p>\r
327A sequence expression split over multiple lines has one expression\r
328per line, and the semicolons at the beginning of lines. Lisp and\r
329Scheme programmers may find this hard to read at first.\r
330</p>\r
331<div class="listingblock">\r
332<div class="content"><div class="highlight"><pre><span class="p">(</span><span class="n">e1</span><span class="w"></span>\r
333<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
334<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">e3</span><span class="p">)</span><span class="w"></span>\r
335</pre></div></div></div>\r
336<div class="paragraph"><p><em>Rationale</em>: this makes it easy to visually spot the beginning of each\r
337expression, which becomes more valuable as the expressions themselves\r
338are split across multiple lines.</p></div>\r
339</li>\r
340<li>\r
341<p>\r
342An application expression has a space between the function and the\r
343argument. There are no parens unless the argument is a tuple (in\r
344which case the parens are really part of the tuple, not the\r
345application).\r
346</p>\r
347<div class="listingblock">\r
348<div class="content"><div class="highlight"><pre><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"></span>\r
349<span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">a1</span><span class="p">,</span><span class="w"> </span><span class="n">a2</span><span class="p">,</span><span class="w"> </span><span class="n">a3</span><span class="p">)</span><span class="w"></span>\r
350</pre></div></div></div>\r
351</li>\r
352<li>\r
353<p>\r
354Avoid redundant parentheses. Application associates to left, so\r
355write\r
356</p>\r
357<div class="listingblock">\r
358<div class="content"><div class="highlight"><pre><span class="n">f</span><span class="w"> </span><span class="n">a1</span><span class="w"> </span><span class="n">a2</span><span class="w"> </span><span class="n">a3</span><span class="w"></span>\r
359</pre></div></div></div>\r
360<div class="paragraph"><p>not</p></div>\r
361<div class="listingblock">\r
362<div class="content"><div class="highlight"><pre><span class="p">((</span><span class="n">f</span><span class="w"> </span><span class="n">a1</span><span class="p">)</span><span class="w"> </span><span class="n">a2</span><span class="p">)</span><span class="w"> </span><span class="n">a3</span><span class="w"></span>\r
363</pre></div></div></div>\r
364</li>\r
365<li>\r
366<p>\r
367Infix operators have a space before and after the operator.\r
368</p>\r
369<div class="listingblock">\r
370<div class="content"><div class="highlight"><pre><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
371<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><span class="n">-</span><span class="w"> </span><span class="n">z</span><span class="w"></span>\r
372</pre></div></div></div>\r
373</li>\r
374<li>\r
375<p>\r
376Avoid redundant parentheses. Use <a href="OperatorPrecedence">OperatorPrecedence</a>. So, write\r
377</p>\r
378<div class="listingblock">\r
379<div class="content"><div class="highlight"><pre><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><span class="n">*</span><span class="w"> </span><span class="n">z</span><span class="w"></span>\r
380</pre></div></div></div>\r
381<div class="paragraph"><p>not</p></div>\r
382<div class="listingblock">\r
383<div class="content"><div class="highlight"><pre><span class="n">x</span><span class="w"> </span><span class="n">+</span><span class="w"> </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">z</span><span class="p">)</span><span class="w"></span>\r
384</pre></div></div></div>\r
385</li>\r
386<li>\r
387<p>\r
388An <span class="monospaced">andalso</span> expression split over multiple lines has the <span class="monospaced">andalso</span>\r
389at the beginning of subsequent lines.\r
390</p>\r
391<div class="listingblock">\r
392<div class="content"><div class="highlight"><pre><span class="n">e1</span><span class="w"></span>\r
393<span class="k">andalso</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
394<span class="k">andalso</span><span class="w"> </span><span class="n">e3</span><span class="w"></span>\r
395</pre></div></div></div>\r
396</li>\r
397<li>\r
398<p>\r
399A <span class="monospaced">case</span> expression is indented as follows\r
400</p>\r
401<div class="listingblock">\r
402<div class="content"><div class="highlight"><pre><span class="k">case</span><span class="w"> </span><span class="n">e1</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
403<span class="w"> </span><span class="n">p1</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">e1</span><span class="w"></span>\r
404<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">p2</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
405<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">p3</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">e3</span><span class="w"></span>\r
406</pre></div></div></div>\r
407</li>\r
408<li>\r
409<p>\r
410A <span class="monospaced">datatype</span>'s constructors are alphabetized.\r
411</p>\r
412<div class="listingblock">\r
413<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="p">|</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">C</span><span class="w"></span>\r
414</pre></div></div></div>\r
415</li>\r
416<li>\r
417<p>\r
418A <span class="monospaced">datatype</span> declaration has a space before and after each <span class="monospaced">|</span>.\r
419</p>\r
420<div class="listingblock">\r
421<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="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><span class="n">C</span><span class="w"></span>\r
422</pre></div></div></div>\r
423</li>\r
424<li>\r
425<p>\r
426A <span class="monospaced">datatype</span> split over multiple lines has one constructor per line,\r
427with the <span class="monospaced">|</span> at the beginning of lines and the constructors beginning\r
4283 columns to the right of the <span class="monospaced">datatype</span>.\r
429</p>\r
430<div class="listingblock">\r
431<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>\r
432<span class="w"> </span><span class="n">A</span><span class="w"></span>\r
433<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">B</span><span class="w"></span>\r
434<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">C</span><span class="w"></span>\r
435</pre></div></div></div>\r
436</li>\r
437<li>\r
438<p>\r
439A <span class="monospaced">fun</span> declaration may start its body on the subsequent line,\r
440indented 3 spaces.\r
441</p>\r
442<div class="listingblock">\r
443<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="n">y</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
444<span class="w"> </span><span class="k">let</span><span class="w"></span>\r
445<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">x</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="n">z</span><span class="w"></span>\r
446<span class="w"> </span><span class="k">in</span><span class="w"></span>\r
447<span class="w"> </span><span class="n">z</span><span class="w"></span>\r
448<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
449</pre></div></div></div>\r
450</li>\r
451<li>\r
452<p>\r
453An <span class="monospaced">if</span> expression is indented as follows.\r
454</p>\r
455<div class="listingblock">\r
456<div class="content"><div class="highlight"><pre><span class="k">if</span><span class="w"> </span><span class="n">e1</span><span class="w"></span>\r
457<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
458<span class="k">else</span><span class="w"> </span><span class="n">e3</span><span class="w"></span>\r
459</pre></div></div></div>\r
460</li>\r
461<li>\r
462<p>\r
463A sequence of <span class="monospaced">if</span>-<span class="monospaced">then</span>-<span class="monospaced">else</span>-s is indented as follows.\r
464</p>\r
465<div class="listingblock">\r
466<div class="content"><div class="highlight"><pre><span class="k">if</span><span class="w"> </span><span class="n">e1</span><span class="w"></span>\r
467<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
468<span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">e3</span><span class="w"></span>\r
469<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">e4</span><span class="w"></span>\r
470<span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">e5</span><span class="w"></span>\r
471<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">e6</span><span class="w"></span>\r
472<span class="k">else</span><span class="w"> </span><span class="n">e7</span><span class="w"></span>\r
473</pre></div></div></div>\r
474</li>\r
475<li>\r
476<p>\r
477A <span class="monospaced">let</span> expression has the <span class="monospaced">let</span>, <span class="monospaced">in</span>, and <span class="monospaced">end</span> on their own\r
478lines, starting in the same column. Declarations and the body are\r
479indented 3 spaces.\r
480</p>\r
481<div class="listingblock">\r
482<div class="content"><div class="highlight"><pre><span class="k">let</span><span class="w"></span>\r
483<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
484<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="mi">14</span><span class="w"></span>\r
485<span class="k">in</span><span class="w"></span>\r
486<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
487<span class="k">end</span><span class="w"></span>\r
488</pre></div></div></div>\r
489</li>\r
490<li>\r
491<p>\r
492A <span class="monospaced">local</span> declaration has the <span class="monospaced">local</span>, <span class="monospaced">in</span>, and <span class="monospaced">end</span> on their own\r
493lines, starting in the same column. Declarations are indented 3\r
494spaces.\r
495</p>\r
496<div class="listingblock">\r
497<div class="content"><div class="highlight"><pre><span class="k">local</span><span class="w"></span>\r
498<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
499<span class="k">in</span><span class="w"></span>\r
500<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
501<span class="k">end</span><span class="w"></span>\r
502</pre></div></div></div>\r
503</li>\r
504<li>\r
505<p>\r
506An <span class="monospaced">orelse</span> expression split over multiple lines has the <span class="monospaced">orelse</span> at\r
507the beginning of subsequent lines.\r
508</p>\r
509<div class="listingblock">\r
510<div class="content"><div class="highlight"><pre><span class="n">e1</span><span class="w"></span>\r
511<span class="k">orelse</span><span class="w"> </span><span class="n">e2</span><span class="w"></span>\r
512<span class="k">orelse</span><span class="w"> </span><span class="n">e3</span><span class="w"></span>\r
513</pre></div></div></div>\r
514</li>\r
515<li>\r
516<p>\r
517A <span class="monospaced">val</span> declaration has a space before and after the <span class="monospaced">=</span>.\r
518</p>\r
519<div class="listingblock">\r
520<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">e</span><span class="w"></span>\r
521</pre></div></div></div>\r
522</li>\r
523<li>\r
524<p>\r
525A <span class="monospaced">val</span> declaration can start the expression on the subsequent line,\r
526indented 3 spaces.\r
527</p>\r
528<div class="listingblock">\r
529<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
530<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">e1</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">e2</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="n">e3</span><span class="w"></span>\r
531</pre></div></div></div>\r
532</li>\r
533</ul></div>\r
534</div>\r
535</div>\r
536<div class="sect1">\r
537<h2 id="_signatures">Signatures</h2>\r
538<div class="sectionbody">\r
539<div class="ulist"><ul>\r
540<li>\r
541<p>\r
542A <span class="monospaced">signature</span> declaration is indented as follows.\r
543</p>\r
544<div class="listingblock">\r
545<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>\r
546<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
547<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">int</span><span class="w"></span>\r
548<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
549</pre></div></div></div>\r
550<div class="paragraph"><p><em>Exception</em>: a signature declaration in a file to itself can omit the\r
551indentation to save horizontal space.</p></div>\r
552<div class="listingblock">\r
553<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>\r
554<span class="k">sig</span><span class="w"></span>\r
555\r
556<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">int</span><span class="w"></span>\r
557\r
558<span class="k">end</span><span class="w"></span>\r
559</pre></div></div></div>\r
560<div class="paragraph"><p>In this case, there should be a blank line after the <span class="monospaced">sig</span> and before\r
561the <span class="monospaced">end</span>.</p></div>\r
562</li>\r
563<li>\r
564<p>\r
565A <span class="monospaced">val</span> specification has a space after the colon, but not before.\r
566</p>\r
567<div class="listingblock">\r
568<div class="content"><div class="highlight"><pre><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">int</span><span class="w"></span>\r
569</pre></div></div></div>\r
570<div class="paragraph"><p><em>Exception</em>: in the case of operators (like <span class="monospaced">+</span>), there is a space\r
571before the colon to avoid lexing the colon as part of the operator.</p></div>\r
572<div class="listingblock">\r
573<div class="content"><div class="highlight"><pre><span class="k">val</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">*</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
574</pre></div></div></div>\r
575</li>\r
576<li>\r
577<p>\r
578Alphabetize specifications in signatures.\r
579</p>\r
580<div class="listingblock">\r
581<div class="content"><div class="highlight"><pre><span class="k">sig</span><span class="w"></span>\r
582<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">int</span><span class="w"></span>\r
583<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">y</span><span class="p">:</span><span class="w"> </span><span class="n">bool</span><span class="w"></span>\r
584<span class="k">end</span><span class="w"></span>\r
585</pre></div></div></div>\r
586</li>\r
587</ul></div>\r
588</div>\r
589</div>\r
590<div class="sect1">\r
591<h2 id="_structures">Structures</h2>\r
592<div class="sectionbody">\r
593<div class="ulist"><ul>\r
594<li>\r
595<p>\r
596A <span class="monospaced">structure</span> declaration has a space on both sides of the <span class="monospaced">=</span>.\r
597</p>\r
598<div class="listingblock">\r
599<div class="content"><div class="highlight"><pre><span class="k">structure</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">Bar</span><span class="w"></span>\r
600</pre></div></div></div>\r
601</li>\r
602<li>\r
603<p>\r
604A <span class="monospaced">structure</span> declaration split over multiple lines is indented as\r
605follows.\r
606</p>\r
607<div class="listingblock">\r
608<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
609<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
610<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">13</span><span class="w"></span>\r
611<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
612</pre></div></div></div>\r
613<div class="paragraph"><p><em>Exception</em>: a structure declaration in a file to itself can omit the\r
614indentation to save horizontal space.</p></div>\r
615<div class="listingblock">\r
616<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
617<span class="k">struct</span><span class="w"></span>\r
618\r
619<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
620\r
621<span class="k">end</span><span class="w"></span>\r
622</pre></div></div></div>\r
623<div class="paragraph"><p>In this case, there should be a blank line after the <span class="monospaced">struct</span> and\r
624before the <span class="monospaced">end</span>.</p></div>\r
625</li>\r
626<li>\r
627<p>\r
628Declarations in a <span class="monospaced">struct</span> are separated by blank lines.\r
629</p>\r
630<div class="listingblock">\r
631<div class="content"><div class="highlight"><pre><span class="k">struct</span><span class="w"></span>\r
632<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>\r
633<span class="w"> </span><span class="k">let</span><span class="w"></span>\r
634<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
635<span class="w"> </span><span class="k">in</span><span class="w"></span>\r
636<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>\r
637<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
638\r
639<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="mi">14</span><span class="w"></span>\r
640<span class="k">end</span><span class="w"></span>\r
641</pre></div></div></div>\r
642</li>\r
643</ul></div>\r
644</div>\r
645</div>\r
646<div class="sect1">\r
647<h2 id="_functors">Functors</h2>\r
648<div class="sectionbody">\r
649<div class="ulist"><ul>\r
650<li>\r
651<p>\r
652A <span class="monospaced">functor</span> declaration has spaces after each <span class="monospaced">:</span> (or <span class="monospaced">:&gt;</span>) but not\r
653before, and a space before and after the <span class="monospaced">=</span>. It is indented as\r
654follows.\r
655</p>\r
656<div class="listingblock">\r
657<div class="content"><div class="highlight"><pre><span class="k">functor</span><span class="w"> </span><span class="n">Foo</span><span class="w"> </span><span class="p">(</span><span class="n">S</span><span class="p">:</span><span class="w"> </span><span class="n">FOO_ARG</span><span class="p">):</span><span class="w"> </span><span class="n">FOO</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
658<span class="w"> </span><span class="k">struct</span><span class="w"></span>\r
659<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">S</span><span class="p">.</span><span class="n">x</span><span class="w"></span>\r
660<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
661</pre></div></div></div>\r
662<div class="paragraph"><p><em>Exception</em>: a functor declaration in a file to itself can omit the\r
663indentation to save horizontal space.</p></div>\r
664<div class="listingblock">\r
665<div class="content"><div class="highlight"><pre><span class="k">functor</span><span class="w"> </span><span class="n">Foo</span><span class="w"> </span><span class="p">(</span><span class="n">S</span><span class="p">:</span><span class="w"> </span><span class="n">FOO_ARG</span><span class="p">):</span><span class="w"> </span><span class="n">FOO</span><span class="w"> </span><span class="p">=</span><span class="w"></span>\r
666<span class="k">struct</span><span class="w"></span>\r
667\r
668<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">S</span><span class="p">.</span><span class="n">x</span><span class="w"></span>\r
669\r
670<span class="k">end</span><span class="w"></span>\r
671</pre></div></div></div>\r
672<div class="paragraph"><p>In this case, there should be a blank line after the <span class="monospaced">struct</span>\r
673and before the <span class="monospaced">end</span>.</p></div>\r
674</li>\r
675</ul></div>\r
676</div>\r
677</div>\r
678</div>\r
679<div id="footnotes"><hr></div>\r
680<div id="footer">\r
681<div id="footer-text">\r
682</div>\r
683<div id="footer-badges">\r
684</div>\r
685</div>\r
686</body>\r
687</html>\r