Commit | Line | Data |
---|---|---|
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 | |
14 | asciidoc.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 | |
36 | SML.</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 | |
45 | A line of code never exceeds 80 columns.\r | |
46 | </p>\r | |
47 | </li>\r | |
48 | <li>\r | |
49 | <p>\r | |
50 | Only split a syntactic entity across multiple lines if it doesn’t fit on one line within 80 columns.\r | |
51 | </p>\r | |
52 | </li>\r | |
53 | <li>\r | |
54 | <p>\r | |
55 | Use alphabetical order wherever possible.\r | |
56 | </p>\r | |
57 | </li>\r | |
58 | <li>\r | |
59 | <p>\r | |
60 | Avoid redundant parentheses.\r | |
61 | </p>\r | |
62 | </li>\r | |
63 | <li>\r | |
64 | <p>\r | |
65 | When 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 | |
77 | Variables, record labels and type constructors begin with and use\r | |
78 | small 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 | |
87 | Variables that represent collections of objects (lists, arrays,\r | |
88 | vectors, …) 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 | |
97 | Constructors, structure identifiers, and functor identifiers begin\r | |
98 | with 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 | |
107 | Signature identifiers are in all capitals, using <span class="monospaced">_</span> to separate\r | |
108 | words.\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 | |
124 | Alphabetize record labels. In a record type, there are spaces after\r | |
125 | colons and commas, but not before colons or commas, or at the\r | |
126 | delimiters <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 | |
134 | Only split a record type across multiple lines if it doesn’t fit on\r | |
135 | one line. If a record type must be split over multiple lines, put one\r | |
136 | field 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 | |
146 | In 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 | |
154 | Only split a tuple type across multiple lines if it doesn’t fit on\r | |
155 | one line. In a tuple type split over multiple lines, there is one\r | |
156 | type 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 | |
164 | apparent.</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 | |
173 | In an arrow type split over multiple lines, put the arrow at the\r | |
174 | beginning 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">-></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 | |
181 | apparent.</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">-></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 | |
189 | Avoid redundant parentheses.\r | |
190 | </p>\r | |
191 | </li>\r | |
192 | <li>\r | |
193 | <p>\r | |
194 | Arrow 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">-></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 | |
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">-></span><span class="w"> </span><span class="p">(</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="p">)</span><span class="w"></span>\r | |
202 | </pre></div></div></div>\r | |
203 | </li>\r | |
204 | <li>\r | |
205 | <p>\r | |
206 | Type 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 | |
218 | Type constructor application binds more tightly than a tuple type,\r | |
219 | so 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 | |
231 | Tuple 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">-></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">-></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 | |
250 | A core expression or declaration split over multiple lines does not\r | |
251 | contain any blank lines.\r | |
252 | </p>\r | |
253 | </li>\r | |
254 | <li>\r | |
255 | <p>\r | |
256 | A record field selector has no space between the <span class="monospaced">#</span> and the record\r | |
257 | label. 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 | |
269 | A tuple has a space after each comma, but not before, and not at the\r | |
270 | delimiters <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 | |
278 | A tuple split over multiple lines has one element per line, and the\r | |
279 | commas 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 | |
289 | A list has a space after each comma, but not before, and not at the\r | |
290 | delimiters <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 | |
298 | A list split over multiple lines has one element per line, and the\r | |
299 | commas 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 | |
309 | A record has spaces before and after <span class="monospaced">=</span>, a space after each comma,\r | |
310 | but not before, and not at the delimiters <span class="monospaced">{</span> and <span class="monospaced">}</span>. Field names\r | |
311 | appear 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 | |
319 | A 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 | |
327 | A sequence expression split over multiple lines has one expression\r | |
328 | per line, and the semicolons at the beginning of lines. Lisp and\r | |
329 | Scheme 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 | |
337 | expression, which becomes more valuable as the expressions themselves\r | |
338 | are split across multiple lines.</p></div>\r | |
339 | </li>\r | |
340 | <li>\r | |
341 | <p>\r | |
342 | An application expression has a space between the function and the\r | |
343 | argument. There are no parens unless the argument is a tuple (in\r | |
344 | which case the parens are really part of the tuple, not the\r | |
345 | application).\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 | |
354 | Avoid redundant parentheses. Application associates to left, so\r | |
355 | write\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 | |
367 | Infix 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 | |
376 | Avoid 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 | |
388 | An <span class="monospaced">andalso</span> expression split over multiple lines has the <span class="monospaced">andalso</span>\r | |
389 | at 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 | |
399 | A <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">=></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">=></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">=></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 | |
410 | A <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 | |
418 | A <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 | |
426 | A <span class="monospaced">datatype</span> split over multiple lines has one constructor per line,\r | |
427 | with the <span class="monospaced">|</span> at the beginning of lines and the constructors beginning\r | |
428 | 3 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 | |
439 | A <span class="monospaced">fun</span> declaration may start its body on the subsequent line,\r | |
440 | indented 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 | |
453 | An <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 | |
463 | A 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 | |
477 | A <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 | |
478 | lines, starting in the same column. Declarations and the body are\r | |
479 | indented 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 | |
492 | A <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 | |
493 | lines, starting in the same column. Declarations are indented 3\r | |
494 | spaces.\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 | |
506 | An <span class="monospaced">orelse</span> expression split over multiple lines has the <span class="monospaced">orelse</span> at\r | |
507 | the 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 | |
517 | A <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 | |
525 | A <span class="monospaced">val</span> declaration can start the expression on the subsequent line,\r | |
526 | indented 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 | |
542 | A <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 | |
551 | indentation 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 | |
561 | the <span class="monospaced">end</span>.</p></div>\r | |
562 | </li>\r | |
563 | <li>\r | |
564 | <p>\r | |
565 | A <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 | |
571 | before 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">-></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 | |
578 | Alphabetize 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 | |
596 | A <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 | |
604 | A <span class="monospaced">structure</span> declaration split over multiple lines is indented as\r | |
605 | follows.\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 | |
614 | indentation 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 | |
624 | before the <span class="monospaced">end</span>.</p></div>\r | |
625 | </li>\r | |
626 | <li>\r | |
627 | <p>\r | |
628 | Declarations 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 | |
652 | A <span class="monospaced">functor</span> declaration has spaces after each <span class="monospaced">:</span> (or <span class="monospaced">:></span>) but not\r | |
653 | before, and a space before and after the <span class="monospaced">=</span>. It is indented as\r | |
654 | follows.\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 | |
663 | indentation 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 | |
673 | and 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 |