Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / localhost / MLtonStructure
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>MLtonStructure</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>MLtonStructure</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>The <span class="monospaced">MLton</span> structure contains a lot of functionality that is not\r
32available in the <a href="BasisLibrary">Basis Library</a>. As a warning,\r
33please keep in mind that the <span class="monospaced">MLton</span> structure and its\r
34substructures do change from release to release of MLton.</p></div>\r
35<div class="listingblock">\r
36<div class="content"><div class="highlight"><pre><span class="k">structure</span><span class="w"> </span><span class="n">MLton</span><span class="p">:</span><span class="w"></span>\r
37<span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
38<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">eq</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;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">bool</span><span class="w"></span>\r
39<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">equal</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;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">bool</span><span class="w"></span>\r
40<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">hash</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">Word32</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
41<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">isMLton</span><span class="p">:</span><span class="w"> </span><span class="n">bool</span><span class="w"></span>\r
42<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">share</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>\r
43<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">shareAll</span><span class="p">:</span><span class="w"> </span><span class="n">unit</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">unit</span><span class="w"></span>\r
44<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">size</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">int</span><span class="w"></span>\r
45\r
46<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Array</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_ARRAY</span><span class="w"></span>\r
47<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">BinIO</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_BIN_IO</span><span class="w"></span>\r
48<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">CharArray</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_MONO_ARRAY</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">CharArray</span><span class="p">.</span><span class="n">array</span><span class="w"></span>\r
49<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">elem</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CharArray</span><span class="p">.</span><span class="n">elem</span><span class="w"></span>\r
50<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">CharVector</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_MONO_VECTOR</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">CharVector</span><span class="p">.</span><span class="n">vector</span><span class="w"></span>\r
51<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">elem</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">CharVector</span><span class="p">.</span><span class="n">elem</span><span class="w"></span>\r
52<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Cont</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_CONT</span><span class="w"></span>\r
53<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Exn</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_EXN</span><span class="w"></span>\r
54<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Finalizable</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_FINALIZABLE</span><span class="w"></span>\r
55<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">GC</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_GC</span><span class="w"></span>\r
56<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">IntInf</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_INT_INF</span><span class="w"></span>\r
57<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Itimer</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_ITIMER</span><span class="w"></span>\r
58<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">LargeReal</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_REAL</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">LargeReal</span><span class="p">.</span><span class="n">real</span><span class="w"></span>\r
59<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">LargeWord</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WORD</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">LargeWord</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
60<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Platform</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_PLATFORM</span><span class="w"></span>\r
61<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Pointer</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_POINTER</span><span class="w"></span>\r
62<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">ProcEnv</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_PROC_ENV</span><span class="w"></span>\r
63<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Process</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_PROCESS</span><span class="w"></span>\r
64<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Profile</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_PROFILE</span><span class="w"></span>\r
65<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Random</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_RANDOM</span><span class="w"></span>\r
66<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Real</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_REAL</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">Real</span><span class="p">.</span><span class="n">real</span><span class="w"></span>\r
67<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Real32</span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
68<span class="w"> </span><span class="k">include</span><span class="w"> </span><span class="n">MLTON_REAL</span><span class="w"></span>\r
69<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">castFromWord</span><span class="p">:</span><span class="w"> </span><span class="n">Word32</span><span class="p">.</span><span class="n">word</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
70<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">castToWord</span><span class="p">:</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">Word32</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
71<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">Real32</span><span class="p">.</span><span class="n">real</span><span class="w"></span>\r
72<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Real64</span><span class="p">:</span><span class="w"> </span><span class="k">sig</span><span class="w"></span>\r
73<span class="w"> </span><span class="k">include</span><span class="w"> </span><span class="n">MLTON_REAL</span><span class="w"></span>\r
74<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">castFromWord</span><span class="p">:</span><span class="w"> </span><span class="n">Word64</span><span class="p">.</span><span class="n">word</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="n">t</span><span class="w"></span>\r
75<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">castToWord</span><span class="p">:</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">Word64</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
76<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">Real64</span><span class="p">.</span><span class="n">real</span><span class="w"></span>\r
77<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Rlimit</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_RLIMIT</span><span class="w"></span>\r
78<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Rusage</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_RUSAGE</span><span class="w"></span>\r
79<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Signal</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_SIGNAL</span><span class="w"></span>\r
80<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Syslog</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_SYSLOG</span><span class="w"></span>\r
81<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">TextIO</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_TEXT_IO</span><span class="w"></span>\r
82<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Thread</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_THREAD</span><span class="w"></span>\r
83<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Vector</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_VECTOR</span><span class="w"></span>\r
84<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Weak</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WEAK</span><span class="w"></span>\r
85<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Word</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WORD</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">Word</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
86<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Word8</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WORD</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">Word8</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
87<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Word16</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WORD</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">Word16</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
88<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Word32</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WORD</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">Word32</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
89<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Word64</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WORD</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">Word64</span><span class="p">.</span><span class="n">word</span><span class="w"></span>\r
90<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Word8Array</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_MONO_ARRAY</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">Word8Array</span><span class="p">.</span><span class="n">array</span><span class="w"></span>\r
91<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">elem</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Word8Array</span><span class="p">.</span><span class="n">elem</span><span class="w"></span>\r
92<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">Word8Vector</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_MONO_VECTOR</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">Word8Vector</span><span class="p">.</span><span class="n">vector</span><span class="w"></span>\r
93<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">elem</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Word8Vector</span><span class="p">.</span><span class="n">elem</span><span class="w"></span>\r
94<span class="w"> </span><span class="k">structure</span><span class="w"> </span><span class="n">World</span><span class="p">:</span><span class="w"> </span><span class="n">MLTON_WORLD</span><span class="w"></span>\r
95<span class="w"> </span><span class="k">end</span><span class="w"></span>\r
96</pre></div></div></div>\r
97</div>\r
98</div>\r
99<div class="sect1">\r
100<h2 id="_substructures">Substructures</h2>\r
101<div class="sectionbody">\r
102<div class="ulist"><ul>\r
103<li>\r
104<p>\r
105<a href="MLtonArray">MLtonArray</a>\r
106</p>\r
107</li>\r
108<li>\r
109<p>\r
110<a href="MLtonBinIO">MLtonBinIO</a>\r
111</p>\r
112</li>\r
113<li>\r
114<p>\r
115<a href="MLtonCont">MLtonCont</a>\r
116</p>\r
117</li>\r
118<li>\r
119<p>\r
120<a href="MLtonExn">MLtonExn</a>\r
121</p>\r
122</li>\r
123<li>\r
124<p>\r
125<a href="MLtonFinalizable">MLtonFinalizable</a>\r
126</p>\r
127</li>\r
128<li>\r
129<p>\r
130<a href="MLtonGC">MLtonGC</a>\r
131</p>\r
132</li>\r
133<li>\r
134<p>\r
135<a href="MLtonIntInf">MLtonIntInf</a>\r
136</p>\r
137</li>\r
138<li>\r
139<p>\r
140<a href="MLtonIO">MLtonIO</a>\r
141</p>\r
142</li>\r
143<li>\r
144<p>\r
145<a href="MLtonItimer">MLtonItimer</a>\r
146</p>\r
147</li>\r
148<li>\r
149<p>\r
150<a href="MLtonMonoArray">MLtonMonoArray</a>\r
151</p>\r
152</li>\r
153<li>\r
154<p>\r
155<a href="MLtonMonoVector">MLtonMonoVector</a>\r
156</p>\r
157</li>\r
158<li>\r
159<p>\r
160<a href="MLtonPlatform">MLtonPlatform</a>\r
161</p>\r
162</li>\r
163<li>\r
164<p>\r
165<a href="MLtonPointer">MLtonPointer</a>\r
166</p>\r
167</li>\r
168<li>\r
169<p>\r
170<a href="MLtonProcEnv">MLtonProcEnv</a>\r
171</p>\r
172</li>\r
173<li>\r
174<p>\r
175<a href="MLtonProcess">MLtonProcess</a>\r
176</p>\r
177</li>\r
178<li>\r
179<p>\r
180<a href="MLtonRandom">MLtonRandom</a>\r
181</p>\r
182</li>\r
183<li>\r
184<p>\r
185<a href="MLtonReal">MLtonReal</a>\r
186</p>\r
187</li>\r
188<li>\r
189<p>\r
190<a href="MLtonRlimit">MLtonRlimit</a>\r
191</p>\r
192</li>\r
193<li>\r
194<p>\r
195<a href="MLtonRusage">MLtonRusage</a>\r
196</p>\r
197</li>\r
198<li>\r
199<p>\r
200<a href="MLtonSignal">MLtonSignal</a>\r
201</p>\r
202</li>\r
203<li>\r
204<p>\r
205<a href="MLtonSyslog">MLtonSyslog</a>\r
206</p>\r
207</li>\r
208<li>\r
209<p>\r
210<a href="MLtonTextIO">MLtonTextIO</a>\r
211</p>\r
212</li>\r
213<li>\r
214<p>\r
215<a href="MLtonThread">MLtonThread</a>\r
216</p>\r
217</li>\r
218<li>\r
219<p>\r
220<a href="MLtonVector">MLtonVector</a>\r
221</p>\r
222</li>\r
223<li>\r
224<p>\r
225<a href="MLtonWeak">MLtonWeak</a>\r
226</p>\r
227</li>\r
228<li>\r
229<p>\r
230<a href="MLtonWord">MLtonWord</a>\r
231</p>\r
232</li>\r
233<li>\r
234<p>\r
235<a href="MLtonWorld">MLtonWorld</a>\r
236</p>\r
237</li>\r
238</ul></div>\r
239</div>\r
240</div>\r
241<div class="sect1">\r
242<h2 id="_values">Values</h2>\r
243<div class="sectionbody">\r
244<div class="ulist"><ul>\r
245<li>\r
246<p>\r
247<span class="monospaced">eq (x, y)</span>\r
248</p>\r
249<div class="paragraph"><p>returns true if <span class="monospaced">x</span> and <span class="monospaced">y</span> are equal as pointers. For simple types\r
250like <span class="monospaced">char</span>, <span class="monospaced">int</span>, and <span class="monospaced">word</span>, this is the same as equals. For\r
251arrays, datatypes, strings, tuples, and vectors, this is a simple\r
252pointer equality. The semantics is a bit murky.</p></div>\r
253</li>\r
254<li>\r
255<p>\r
256<span class="monospaced">equal (x, y)</span>\r
257</p>\r
258<div class="paragraph"><p>returns true if <span class="monospaced">x</span> and <span class="monospaced">y</span> are structurally equal. For equality\r
259types, this is the same as <a href="PolymorphicEquality">PolymorphicEquality</a>. For other types,\r
260it is a conservative approximation of equivalence.</p></div>\r
261</li>\r
262<li>\r
263<p>\r
264<span class="monospaced">hash x</span>\r
265</p>\r
266<div class="paragraph"><p>returns a structural hash of <span class="monospaced">x</span>. The hash function is consistent\r
267between execution of the same program, but may not be consistent\r
268between different programs.</p></div>\r
269</li>\r
270<li>\r
271<p>\r
272<span class="monospaced">isMLton</span>\r
273</p>\r
274<div class="paragraph"><p>is always <span class="monospaced">true</span> in a MLton implementation, and is always <span class="monospaced">false</span> in a\r
275stub implementation.</p></div>\r
276</li>\r
277<li>\r
278<p>\r
279<span class="monospaced">share x</span>\r
280</p>\r
281<div class="paragraph"><p>maximizes sharing in the heap for the object graph reachable from <span class="monospaced">x</span>.</p></div>\r
282</li>\r
283<li>\r
284<p>\r
285<span class="monospaced">shareAll ()</span>\r
286</p>\r
287<div class="paragraph"><p>maximizes sharing in the heap by sharing space for equivalent\r
288immutable objects. A call to <span class="monospaced">shareAll</span> performs a major garbage\r
289collection, and takes time proportional to the size of the heap.</p></div>\r
290</li>\r
291<li>\r
292<p>\r
293<span class="monospaced">size x</span>\r
294</p>\r
295<div class="paragraph"><p>returns the amount of heap space (in bytes) taken by the value of <span class="monospaced">x</span>,\r
296including all objects reachable from <span class="monospaced">x</span> by following pointers. It\r
297takes time proportional to the size of <span class="monospaced">x</span>. See below for an example.</p></div>\r
298</li>\r
299</ul></div>\r
300</div>\r
301</div>\r
302<div class="sect1">\r
303<h2 id="_a_id_size_a_example_of_span_class_monospaced_mlton_size_span"><a id="size"></a>Example of <span class="monospaced">MLton.size</span></h2>\r
304<div class="sectionbody">\r
305<div class="paragraph"><p>This example, <span class="monospaced">size.sml</span>, demonstrates the application of <span class="monospaced">MLton.size</span>\r
306to many different kinds of objects.</p></div>\r
307<div class="listingblock">\r
308<div class="content"><div class="highlight"><pre><span class="k">fun</span><span class="w"> </span><span class="n">&#39;a</span><span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="n">name</span><span class="p">:</span><span class="w"> </span><span class="n">string</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">:</span><span class="w"> </span><span class="n">&#39;a</span><span class="p">):</span><span class="w"> </span><span class="n">unit</span><span class="p">=</span><span class="w"></span>\r
309<span class="w"> </span><span class="p">(</span><span class="n">print</span><span class="w"> </span><span class="s">&quot;The size of &quot;</span><span class="w"></span>\r
310<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="n">name</span><span class="w"></span>\r
311<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="s">&quot; is &quot;</span><span class="w"></span>\r
312<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="n">Int</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="p">(</span><span class="n">MLton</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="n">value</span><span class="p">))</span><span class="w"></span>\r
313<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="s">&quot; bytes.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span><span class="w"></span>\r
314\r
315<span class="k">val</span><span class="w"> </span><span class="n">l</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="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">]</span><span class="w"></span>\r
316\r
317<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>\r
318<span class="w"> </span><span class="p">(</span><span class="w"></span>\r
319<span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;an int list of length 4&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">l</span><span class="p">)</span><span class="w"></span>\r
320<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;a string of length 10&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;0123456789&quot;</span><span class="p">)</span><span class="w"></span>\r
321<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;an int array of length 10&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">Array</span><span class="p">.</span><span class="n">tabulate</span><span class="w"> </span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">))</span><span class="w"></span>\r
322<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;a double array of length 10&quot;</span><span class="p">,</span><span class="w"></span>\r
323<span class="w"> </span><span class="n">Array</span><span class="p">.</span><span class="n">tabulate</span><span class="w"> </span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="mf">0.0</span><span class="p">))</span><span class="w"></span>\r
324<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;an array of length 10 of 2-ples of ints&quot;</span><span class="p">,</span><span class="w"></span>\r
325<span class="w"> </span><span class="n">Array</span><span class="p">.</span><span class="n">tabulate</span><span class="w"> </span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="n">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)))</span><span class="w"></span>\r
326<span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;a useless function&quot;</span><span class="p">,</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="mi">13</span><span class="p">)</span><span class="w"></span>\r
327<span class="w"> </span><span class="p">)</span><span class="w"></span>\r
328\r
329<span class="cm">(* This is here so that the list is &quot;useful&quot;.</span>\r
330<span class="cm"> * If it were removed, then the optimizer (remove-unused-constructors)</span>\r
331<span class="cm"> * would remove l entirely.</span>\r
332<span class="cm"> *)</span><span class="w"></span>\r
333<span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">foldl</span><span class="w"> </span><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><span class="mi">0</span><span class="w"> </span><span class="n">l</span><span class="w"></span>\r
334<span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
335<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="n">Fail</span><span class="w"> </span><span class="s">&quot;bug&quot;</span><span class="w"></span>\r
336\r
337<span class="k">local</span><span class="w"></span>\r
338<span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">MLton</span><span class="p">.</span><span class="n">Cont</span><span class="w"></span>\r
339<span class="k">in</span><span class="w"></span>\r
340<span class="w"> </span><span class="k">val</span><span class="w"> </span><span class="n">rc</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="n">option</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">option</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">ref</span><span class="w"> </span><span class="n">NONE</span><span class="w"></span>\r
341<span class="w"> </span><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>\r
342<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">callcc</span><span class="w"> </span><span class="p">(</span><span class="k">fn</span><span class="w"> </span><span class="n">k</span><span class="p">:</span><span class="w"> </span><span class="n">int</span><span class="w"> </span><span class="n">option</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="p">(</span><span class="n">rc</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="n">k</span><span class="p">;</span><span class="w"> </span><span class="n">throw</span><span class="w"> </span><span class="p">(</span><span class="n">k</span><span class="p">,</span><span class="w"> </span><span class="n">NONE</span><span class="p">)))</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
343<span class="w"> </span><span class="n">NONE</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
344<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="n">concat</span><span class="w"> </span><span class="p">[</span><span class="n">Int</span><span class="p">.</span><span class="n">toString</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">])</span><span class="w"></span>\r
345<span class="k">end</span><span class="w"></span>\r
346\r
347<span class="k">val</span><span class="w"> </span><span class="p">_</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">printSize</span><span class="w"> </span><span class="p">(</span><span class="s">&quot;a continuation option ref&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">rc</span><span class="p">)</span><span class="w"></span>\r
348\r
349<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>\r
350<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">!rc</span><span class="w"> </span><span class="k">of</span><span class="w"></span>\r
351<span class="w"> </span><span class="n">NONE</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">()</span><span class="w"></span>\r
352<span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="n">k</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="n">:=</span><span class="w"> </span><span class="n">NONE</span><span class="p">;</span><span class="w"> </span><span class="n">MLton</span><span class="p">.</span><span class="n">Cont</span><span class="p">.</span><span class="n">throw</span><span class="w"> </span><span class="p">(</span><span class="n">k</span><span class="p">,</span><span class="w"> </span><span class="n">SOME</span><span class="w"> </span><span class="mi">13</span><span class="p">))</span><span class="w"></span>\r
353</pre></div></div></div>\r
354<div class="paragraph"><p>Compile and run as usual.</p></div>\r
355<div class="listingblock">\r
356<div class="content monospaced">\r
357<pre>% mlton size.sml\r
358% ./size\r
359The size of an int list of length 4 is 48 bytes.\r
360The size of a string of length 10 is 24 bytes.\r
361The size of an int array of length 10 is 52 bytes.\r
362The size of a double array of length 10 is 92 bytes.\r
363The size of an array of length 10 of 2-ples of ints is 92 bytes.\r
364The size of a useless function is 0 bytes.\r
365The size of a continuation option ref is 4544 bytes.\r
36613\r
367The size of a continuation option ref is 8 bytes.</pre>\r
368</div></div>\r
369<div class="paragraph"><p>Note that sizes are dependent upon the target platform and compiler\r
370optimizations.</p></div>\r
371</div>\r
372</div>\r
373</div>\r
374<div id="footnotes"><hr></div>\r
375<div id="footer">\r
376<div id="footer-text">\r
377</div>\r
378<div id="footer-badges">\r
379</div>\r
380</div>\r
381</body>\r
382</html>\r