adding Socket UDP sample server and client
[io.git] / docs / guide.html
blob9ed8005b305c3de145309c9701ce9ce2709f3618
1 <?xml version="1.0"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml">
4 <head>
5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6 <title></title>
7 <link rel="stylesheet" type="text/css" media="screen" href="guide_files/guide.css" />
8 </head>
9 <body style="margin: 36pt 63pt 36pt 63pt;">
10 <div style="margin : 72pt 0pt 0pt 0pt; ">
11 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-top: 0pt; text-align: right; font-size: 32.00pt; " class="Heading ">Io, The Programming Language </p>
12 <p class="Version " style="font-size: 8.00pt; vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
13 <p class="Copyright " style="font-size: 8.00pt; vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
14 <p class="Copyright "></p>
15 <p style="padding-bottom: 0pt; vertical-align: 0.000000em; " class="Heading ">Contents</p>
16 </div>
17 <div style="margin : 18pt 0pt 0pt 36pt; ">
18 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
19 <a href="#TOC681" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Introduction</a>
20 </p>
21 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
22 <a href="#TOC1090" style="color: #3f3f3f; ">Perspective</a>
23 </p>
24 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
25 <a href="#TOC2441" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Getting Started</a>
26 </p>
27 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
28 <a href="#TOC2457" style="color: #3f3f3f; ">Downloading</a>
29 </p>
30 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
31 <a href="#TOC2532" style="color: #3f3f3f; ">Installing</a>
32 </p>
33 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
34 <a href="#TOC3139" style="color: #3f3f3f; ">Binaries</a>
35 </p>
36 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
37 <a href="#TOC3508" style="color: #3f3f3f; ">Running Scripts</a>
38 </p>
39 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
40 <a href="#TOC3690" style="color: #3f3f3f; ">Interactive Mode</a>
41 </p>
42 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
43 <a href="#TOC5089" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Syntax</a>
44 </p>
45 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
46 <a href="#TOC5137" style="color: #3f3f3f; ">Expressions</a>
47 </p>
48 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
49 <a href="#TOC5434" style="color: #3f3f3f; ">Messages</a>
50 </p>
51 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
52 <a href="#TOC6628" style="color: #3f3f3f; ">Operators</a>
53 </p>
54 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
55 <a href="#TOC7147" style="color: #3f3f3f; ">Assignment</a>
56 </p>
57 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
58 <a href="#TOC7540" style="color: #3f3f3f; ">Numbers</a>
59 </p>
60 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
61 <a href="#TOC7712" style="color: #3f3f3f; ">Strings</a>
62 </p>
63 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
64 <a href="#TOC8048" style="color: #3f3f3f; ">Comments</a>
65 </p>
66 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
67 <a href="#TOC8442" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Objects</a>
68 </p>
69 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
70 <a href="#TOC8880" style="color: #3f3f3f; ">Overview</a>
71 </p>
72 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
73 <a href="#TOC8979" style="color: #3f3f3f; ">Prototypes</a>
74 </p>
75 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
76 <a href="#TOC9876" style="color: #3f3f3f; ">Inheritance</a>
77 </p>
78 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
79 <a href="#TOC11106" style="color: #3f3f3f; ">Methods</a>
80 </p>
81 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
82 <a href="#TOC11896" style="color: #3f3f3f; ">Blocks</a>
83 </p>
84 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
85 <a href="#TOC13825" style="color: #3f3f3f; ">Forward</a>
86 </p>
87 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
88 <a href="#TOC14231" style="color: #3f3f3f; ">Resend</a>
89 </p>
90 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
91 <a href="#TOC14523" style="color: #3f3f3f; ">Super</a>
92 </p>
93 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
94 <a href="#TOC14781" style="color: #3f3f3f; ">Introspection</a>
95 </p>
96 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
97 <a href="#TOC15891" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Control Flow</a>
98 </p>
99 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
100 <a href="#TOC15904" style="color: #3f3f3f; ">true, false and nil</a>
101 </p>
102 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
103 <a href="#TOC16107" style="color: #3f3f3f; ">Comparison</a>
104 </p>
105 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
106 <a href="#TOC16229" style="color: #3f3f3f; ">Conditions</a>
107 </p>
108 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
109 <a href="#TOC17081" style="color: #3f3f3f; ">Loops</a>
110 </p>
111 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
112 <a href="#TOC18503" style="color: #3f3f3f; ">Importing</a>
113 </p>
114 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
115 <a href="#TOC18905" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Concurrency</a>
116 </p>
117 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
118 <a href="#TOC18917" style="color: #3f3f3f; ">Coroutines</a>
119 </p>
120 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
121 <a href="#TOC19256" style="color: #3f3f3f; ">Scheduler</a>
122 </p>
123 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
124 <a href="#TOC19435" style="color: #3f3f3f; ">Actors</a>
125 </p>
126 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
127 <a href="#TOC20564" style="color: #3f3f3f; ">Yield</a>
128 </p>
129 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
130 <a href="#TOC20766" style="color: #3f3f3f; ">Pause and Resume</a>
131 </p>
132 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
133 <a href="#TOC20918" style="color: #3f3f3f; ">Futures</a>
134 </p>
135 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
136 <a href="#TOC21799" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Exceptions</a>
137 </p>
138 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
139 <a href="#TOC21810" style="color: #3f3f3f; ">Raise</a>
140 </p>
141 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
142 <a href="#TOC22153" style="color: #3f3f3f; ">Try and Catch</a>
143 </p>
144 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
145 <a href="#TOC22703" style="color: #3f3f3f; ">Pass</a>
146 </p>
147 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
148 <a href="#TOC23008" style="color: #3f3f3f; ">Custom Exceptions</a>
149 </p>
150 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
151 <a href="#TOC23148" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Primitives</a>
152 </p>
153 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
154 <a href="#TOC23864" style="color: #3f3f3f; ">Object</a>
155 </p>
156 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
157 <a href="#TOC24100" style="color: #3f3f3f; ">List</a>
158 </p>
159 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
160 <a href="#TOC26083" style="color: #3f3f3f; ">Sequence</a>
161 </p>
162 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
163 <a href="#TOC27607" style="color: #3f3f3f; ">Ranges</a>
164 </p>
165 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
166 <a href="#TOC28533" style="color: #3f3f3f; ">File</a>
167 </p>
168 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
169 <a href="#TOC28810" style="color: #3f3f3f; ">Directory</a>
170 </p>
171 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
172 <a href="#TOC29611" style="color: #3f3f3f; ">Date</a>
173 </p>
174 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
175 <a href="#TOC30156" style="color: #3f3f3f; ">Networking</a>
176 </p>
177 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
178 <a href="#TOC31463" style="color: #3f3f3f; ">XML</a>
179 </p>
180 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
181 <a href="#TOC31637" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Unicode</a>
182 </p>
183 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
184 <a href="#TOC31645" style="color: #3f3f3f; ">Sequence Encodings</a>
185 </p>
186 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
187 <a href="#TOC32526" style="color: #3f3f3f; ">Source Code</a>
188 </p>
189 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
190 <a href="#TOC32941" style="color: #3f3f3f; ">Conversion</a>
191 </p>
192 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
193 <a href="#TOC33031" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Embedding</a>
194 </p>
195 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
196 <a href="#TOC33041" style="color: #3f3f3f; ">Coding Conventions</a>
197 </p>
198 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
199 <a href="#TOC34530" style="color: #3f3f3f; ">IoState</a>
200 </p>
201 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
202 <a href="#TOC35356" style="color: #3f3f3f; ">Values</a>
203 </p>
204 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
205 <a href="#TOC36136" style="color: #3f3f3f; ">Bindings</a>
206 </p>
207 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
208 <a href="#TOC36161" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Appendix</a>
209 </p>
210 <p style="margin-bottom: 0.000000pt; margin-left: 141.58pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -123.58pt; " class="TOC_Heading_3 ">
211 <a href="#TOC36170" style="color: #3f3f3f; ">Grammar</a>
212 </p>
213 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
214 <a href="#TOC37599" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">Credits</a>
215 </p>
216 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
217 <a href="#TOC38140" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">References</a>
218 </p>
219 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; padding-top: 0pt; text-indent: -0.00pt; " class="TOC_Heading_2 ">
220 <a href="#TOC38156" style="color: #000000; font-weight: bold; letter-spacing: -0.02em; ">License</a>
221 </p>
222 <p class="Heading " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
223 </div>
224 <div style="margin : 0pt 0pt 0pt 0pt; ">
225 <p></p>
226 <p style="padding-top: 0pt; " class="Heading ">
227 <a name="TOC681" id="TOC681">
228 <span style="vertical-align: 0.000000em; ">Introduction</span>
229 <span style="font-family: 'Times-Roman', 'Times'; font-size: 11.00pt; line-height: 1.18; vertical-align: 0.000000em; "></span>
230 </a>
231 </p>
232 <p class="Quote " style="vertical-align: 0.000000em; ">Simplicity is the essence of happiness.<br />- Cedric Bledsoe</p>
233 <p class="Body " style="vertical-align: 0.000000em; ">Io is a dynamic prototype-based programming language. The ideas in Io are mostly inspired by Smalltalk[1] (all values are objects), Self[2] (prototype-based), NewtonScript[3] (differential inheritance), Act1[4] (actors and futures for concurrency), Lisp[5] (code is a runtime inspectable / modifiable tree) and Lua[6] (small, embeddable).</p>
234 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Heading_1 ">
235 <a name="TOC1090" id="TOC1090">
236 <span>Perspective</span>
237 <span style="font-family: 'Times-Roman', 'Times'; line-height: 1.29; "></span>
238 </a>
239 </p>
240 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Why Another Language?</p>
241 <p class="Body " style="vertical-align: 0.000000em; ">The focus of programming language research for the last thirty years has been to combine the high level expressive power of Smalltalk and the performance of low level languages with little attention paid to advancing expressive power itself. Io&#x2019;s purpose is to refocus attention on expressiveness by exploring higher level dynamic programming features with greater levels of runtime flexibility and simplified programming syntax and semantics.</p>
242 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
243 <p class="Body " style="vertical-align: 0.000000em; ">In Io, all values are objects (of which, anything can change at runtime, including slots, methods and inheritance), all code is made up of expressions (which are runtime inspectable and modifiable) and all expressions are made up of dynamic message sends (including assignment and control structures). Execution contexts themselves are objects and activatable objects such as methods/blocks and functions are unified into blocks with assignable scope. Concurrency is made more easily manageable through actors and implemented using coroutines for scalability.</p>
244 <p style="margin-bottom: 0.000000pt; margin-left: 71.65pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Heading_2 ">
245 <span>Practical Goals</span>
246 <span style="font-family: 'Times-Roman', 'Times'; font-size: 11.00pt; line-height: 1.18; "></span>
247 </p>
248 <p class="Body " style="vertical-align: 0.000000em; ">To be a language that is:</p>
249 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
250 <ol class="Bullet_5 " start="1">
251 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.20; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
252 <p style="text-indent: 6.000000pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; " class="Body_Bullet ">simple</p>
253 </li>
254 </ol>
255 <ol class="Bullet_6 " start="1">
256 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
257 <p style="text-indent: 6.000000pt; vertical-align: 0.000000em; " class="Body_Bullet ">conceptually simple and consistent</p>
258 </li>
259 </ol>
260 <ol class="Bullet_6 " start="2">
261 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
262 <p style="text-indent: 6.000000pt; " class="Body_Bullet ">
263 <span style="font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; ">easily embedded and extended</span>
264 <span style="vertical-align: 0.000000em; "></span>
265 </p>
266 </li>
267 </ol>
268 <ol class="Bullet_5 " start="2">
269 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
270 <p style="text-indent: 6.000000pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; " class="Body_Bullet ">powerful</p>
271 </li>
272 </ol>
273 <ol class="Bullet_6 " start="1">
274 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
275 <p style="text-indent: 6.000000pt; vertical-align: 0.000000em; " class="Body_Bullet ">highly dynamic and introspective</p>
276 </li>
277 </ol>
278 <ol class="Bullet_6 " start="2">
279 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
280 <p style="text-indent: 6.000000pt; " class="Body_Bullet ">
281 <span style="vertical-align: 0.000000em; ">highly concurrent (via coroutines and async i/o)</span>
282 <span style="font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; "></span>
283 </p>
284 </li>
285 </ol>
286 <ol class="Bullet_5 " start="3">
287 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
288 <p style="text-indent: 6.000000pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; " class="Body_Bullet ">practical</p>
289 </li>
290 </ol>
291 <ol class="Bullet_6 " start="1">
292 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
293 <p style="text-indent: 6.000000pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; " class="Body_Bullet ">fast enough</p>
294 </li>
295 </ol>
296 <ol class="Bullet_6 " start="2">
297 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
298 <p style="text-indent: 6.000000pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; " class="Body_Bullet ">multi-platform</p>
299 </li>
300 </ol>
301 <ol class="Bullet_6 " start="3">
302 <li style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0; line-height: 1.44; text-decoration: none; text-transform: none; vertical-align: 0.000000em; ">
303 <p style="text-indent: 6.000000pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.44; vertical-align: 0.000000em; " class="Body_Bullet ">a comprehensive set of standard packages which also have these goals</p>
304 </li>
305 </ol>
306 <p class="Heading "></p>
307 <p class="Heading ">
308 <a name="TOC2441" style="vertical-align: 0.000000em; " id="TOC2441">Getting Started</a>
309 </p>
310 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Heading_1 ">
311 <a name="TOC2457" id="TOC2457">
312 <span>Downloading</span>
313 <span> </span>
314 </a>
315 </p>
316 <p class="Body " style="vertical-align: 0.000000em; ">Io distributions are available at:</p>
317 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
318 <p class="Code ">
319 <a href="http://www.iolanguage.com" style="color: #0e009d; text-decoration: underline; vertical-align: 0.000000em; ">http://www.iolanguage.com</a>
320 <span style="vertical-align: 0.000000em; "></span>
321 </p>
322 <p class="Heading_1 ">
323 <a name="TOC2532" style="vertical-align: 0.000000em; " id="TOC2532">Installing</a>
324 </p>
325 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">To build, from the top folder, run:</p>
326 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
327 <p class="Code " style="vertical-align: 0.000000em; ">make </p>
328 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
329 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Binaries will be placed in the _build/binaries subfolder. To install:</p>
330 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
331 <p class="Code " style="vertical-align: 0.000000em; ">sudo make install </p>
332 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
333 <p class="Body " style="vertical-align: 0.000000em; ">or, if you&#x2019;d like the install to simply link to your development folder:</p>
334 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
335 <p class="Code " style="vertical-align: 0.000000em; ">sudo make linkInstall</p>
336 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
337 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">and to run the unit tests:</p>
338 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
339 <p class="Code " style="vertical-align: 0.000000em; ">make test</p>
340 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Addons</p>
341 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Some of Io&#x2019;s addons require libraries that may not be installed on your system already. To install these automatically, type either:</p>
342 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
343 <p class="Code " style="vertical-align: 0.000000em; ">su -c " sudo make aptget&#x201D;</p>
344 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
345 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">or:</p>
346 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
347 <p class="Code " style="vertical-align: 0.000000em; ">su -c "make emerge&#x201D;</p>
348 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
349 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">or:</p>
350 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
351 <p class="Code " style="vertical-align: 0.000000em; ">sudo make port</p>
352 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
353 <p class="Body " style="vertical-align: 0.000000em; ">Depending on which package installer you use. Port is macports/darwinports (http://www.macports.org/) for OSX.</p>
354 <p class="Heading_1 ">
355 <a name="TOC3139" style="vertical-align: 0.000000em; " id="TOC3139">Binaries</a>
356 </p>
357 <p class="Body " style="vertical-align: 0.000000em; ">Io builds two executables and places them in the binaries folder. They are: </p>
358 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
359 <p class="Code " style="vertical-align: 0.000000em; ">io_static</p>
360 <p class="Code " style="vertical-align: 0.000000em; ">io</p>
361 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
362 <p class="Body " style="vertical-align: 0.000000em; ">The io_static executable contains the vm with a minimal set of primitives all statically linked into the executable. The io executable contains just enough to load the iovm dynamically linked library and is able to dynamically load io addons when they are referenced.</p>
363 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Heading_1 ">
364 <a name="TOC3508" id="TOC3508">Running Scripts</a>
365 </p>
366 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">An example of running a script: </p>
367 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
368 <p class="Code " style="vertical-align: 0.000000em; ">io samples/HelloWorld.io</p>
369 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
370 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">There is no main() function or object that gets executed first in Io. Scripts are executed when compiled.</p>
371 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Heading_1 ">
372 <a name="TOC3690" id="TOC3690">
373 <span>Interactive Mode</span>
374 <span style="font-family: 'Times-Roman', 'Times'; font-size: 11.00pt; line-height: 1.18; "></span>
375 </a>
376 </p>
377 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Running: </p>
378 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
379 <p class="Code " style="vertical-align: 0.000000em; ">./_build/binaries/io</p>
380 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
381 <p class="Body " style="vertical-align: 0.000000em; ">Or, if Io is installed, running:</p>
382 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
383 <p class="Code " style="vertical-align: 0.000000em; ">io</p>
384 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
385 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">will open the Io interpreter prompt. </p>
386 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
387 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">You can evaluate code by entering it directly. Example:</p>
388 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
389 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; "Hello world!" println</p>
390 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; Hello world!</p>
391 <p class="Body " style="font-family: 'Times-Roman', 'Times'; font-size: 11.00pt; line-height: 1.18; vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
392 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Expressions are evaluated in the context of the Lobby: </p>
393 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
394 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; print</p>
395 <p class="Code " style="vertical-align: 0.000000em; ">[printout of lobby contents]</p>
396 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
397 <p class="Body " style="vertical-align: 0.000000em; ">If you have a .iorc file in your home folder, it will be evaled before the interactive prompt starts. Also, rlwrap can be used to add line history features:</p>
398 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
399 <p class="Code " style="vertical-align: 0.000000em; ">rlwrap io</p>
400 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Inspecting objects</p>
401 <p class="Body " style="vertical-align: 0.000000em; ">You can get a list of the slots of an object like this:</p>
402 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
403 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; someObject slotNames</p>
404 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
405 <p class="Body " style="vertical-align: 0.000000em; ">To show them in sorted order:</p>
406 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
407 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; someObject slotNames sort</p>
408 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
409 </div>
410 <div style="margin : 0pt 0pt 0pt 0pt; ">
411 <p></p>
412 <p style="padding-top: 0pt; vertical-align: 0.000000em; " class="Heading_2 ">doFile and doString</p>
413 <p class="Body " style="vertical-align: 0.000000em; ">A script can be run from the interactive mode using the doFile method:</p>
414 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
415 <p class="Code " style="vertical-align: 0.000000em; ">doFile(&#x201C;scriptName.io&#x201D;)</p>
416 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
417 <p class="Body " style="vertical-align: 0.000000em; ">The evaluation context of doFile is the receiver, which in this case would be the lobby. To evaluate the script in the context of some other object, simply send the doFile message to it:</p>
418 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
419 <p class="Code " style="vertical-align: 0.000000em; ">someObject doFile(&#x201C;scriptName.io&#x201D;)</p>
420 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
421 <p class="Body " style="vertical-align: 0.000000em; ">The doString method can be used to evaluate a string:</p>
422 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
423 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; doString(&#x201C;1+1&#x201D;)</p>
424 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 2</p>
425 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
426 <p class="Body " style="vertical-align: 0.000000em; ">And to evaluate a string in the context of a particular object:</p>
427 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
428 <p class="Code " style="vertical-align: 0.000000em; ">someObject doString(&#x201C;1 + 1&#x201D;)</p>
429 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Command Line Arguments</p>
430 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Example of printing out command line arguments:</p>
431 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
432 <p class="Code ">
433 <span style="vertical-align: 0.000000em; ">args foreach(k, v, write("'", v, "'\n"))</span>
434 <span style="font-family: 'Times-Roman', 'Times'; font-size: 11.00pt; line-height: 1.18; vertical-align: 0.000000em; "></span>
435 </p>
436 <p class="Heading_2 " style="vertical-align: 0.000000em; ">launchPath</p>
437 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The Lobby "launchPath" slot is set to the location on the initial source file that is executed.</p>
438 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
439 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body "></p>
440 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
441 <p class="Heading ">
442 <a name="TOC5089" style="font-family: 'Helvetica-Bold', 'Helvetica'; font-size: 24.00pt; font-weight: bold; line-height: 1.21; vertical-align: 0.000000em; " id="TOC5089">Syntax</a>
443 </p>
444 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Quote ">Less is more.<br />- Ludwig Mies van der Rohe</p>
445 <p class="Heading_1 ">
446 <a name="TOC5137" id="TOC5137">
447 <span style="vertical-align: 0.000000em; ">Expressions</span>
448 <span style="vertical-align: 0.000000em; "></span>
449 </a>
450 </p>
451 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
452 <span>Io has no keywords or statements. Everything is an expression composed entirely of messages, </span>
453 <span>each of which is a runtime accessible object</span>
454 <span>. The informal BNF description:</span>
455 </p>
456 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
457 <div style="margin-bottom: 0.000000pt; margin-left: 89.65pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
458 <table cellspacing="0" style="background-color: transparent; border-collapse: collapse; " class="Table">
459 <tr>
460 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 65pt; vertical-align: top; width: 65pt; " class="Normal table_cell_style_default">
461 <div>
462 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-top: 0pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; font-weight: normal; line-height: 1.22; " class="Body ">exp</p>
463 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; font-weight: normal; line-height: 1.22; " class="Body ">message</p>
464 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; font-weight: normal; line-height: 1.22; " class="Body ">arguments</p>
465 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; font-weight: normal; line-height: 1.22; " class="Body ">symbol</p>
466 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; font-weight: normal; line-height: 1.22; " class="Body ">terminator</p>
467 </div>
468 </td>
469 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 65pt; vertical-align: top; width: 310pt; " class="Normal table_cell_style_default">
470 <div>
471 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; padding-top: 0pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; line-height: 1.22; " class="Body ">::= { message | terminator }</p>
472 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; line-height: 1.22; " class="Body ">::= symbol [arguments]</p>
473 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; line-height: 1.22; " class="Body ">::= &#x201C;(&#x201C; [exp [ { &#x201C;,&#x201D; exp } ]] &#x201C;)&#x201D;</p>
474 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; line-height: 1.22; " class="Body ">::= identifier | number | string</p>
475 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; text-indent: 0.00pt; font-family: 'Courier', 'Courier'; font-size: 9.00pt; font-style: normal; line-height: 1.22; " class="Body ">::= &#x201C;\n&#x201D; | &#x201C;;&#x201D;</p>
476 </div>
477 </td>
478 </tr>
479 </table>
480 </div>
481 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
482 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
483 <span>For </span>
484 <span>performance reason</span>
485 <span>s, String and Number literal messages have their results cached in their message objects.</span>
486 </p>
487 <p class="Heading_1 ">
488 <a name="TOC5434" style="vertical-align: 0.000000em; " id="TOC5434">Messages</a>
489 </p>
490 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
491 <span>Message arguments are passed as expressions and evaluated by the receiver. Selective evaluation of arguments </span>
492 <span>can be used </span>
493 <span>to implement control flow. Examples:</span>
494 </p>
495 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
496 <p class="Code " style="font-size: 9.00pt; vertical-align: 0.000000em; ">for(i, 1, 10, i println)</p>
497 <p class="Code ">
498 <span style="font-size: 9.00pt; vertical-align: 0.000000em; ">a := if(b == 0, c + 1, d)</span>
499 <span style="vertical-align: 0.000000em; "></span>
500 </p>
501 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
502 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
503 <span>In the above code,</span>
504 <span> &#x201C;</span>
505 <span>for&#x201D; and &#x201C;if&#x201D; are just normal messages, not special forms or keywords.</span>
506 </p>
507 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
508 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Likewise, dynamic evaluation can be used with enumeration without the need to wrap the expression in a block. Examples:</p>
509 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
510 <p class="Code " style="vertical-align: 0.000000em; ">people select(person, person age &lt; 30)</p>
511 <p class="Code ">
512 <span style="vertical-align: 0.000000em; ">names := people map(person, person name)</span>
513 <span style="vertical-align: 0.000000em; "></span>
514 </p>
515 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
516 <p class="Body " style="vertical-align: 0.000000em; ">Methods like map and select will typically apply the expression directly to the values if only the expression is provided:</p>
517 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
518 <p class="Code " style="vertical-align: 0.000000em; ">people select(age &lt; 30)</p>
519 <p class="Code " style="vertical-align: 0.000000em; ">names := people map(name)</p>
520 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
521 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">There is also some syntax sugar for operators (including assignment), which are handled by an Io macro executed on the expression after it is compiled into a message tree. Some sample source code:</p>
522 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
523 <p class="Code " style="vertical-align: 0.000000em; ">Account := Object clone</p>
524 <p class="Code " style="vertical-align: 0.000000em; ">Account balance := 0</p>
525 <p class="Code " style="vertical-align: 0.000000em; ">Account deposit := method(amount,</p>
526 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;balance = balance + amount</p>
527 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
528 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
529 <p class="Code " style="vertical-align: 0.000000em; ">account := Account clone</p>
530 <p class="Code " style="vertical-align: 0.000000em; ">account deposit(10.00)</p>
531 <p class="Code " style="vertical-align: 0.000000em; ">account balance println</p>
532 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
533 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Like Self[2], Io&#x2019;s syntax does not distinguish between accessing a slot containing a method from one containing a variable.</p>
534 <p class="Heading_1 ">
535 <a name="TOC6628" style="vertical-align: 0.000000em; " id="TOC6628">Operators</a>
536 </p>
537 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">An operator is just a message whose name contains no alphanumeric characters (other than ":", "_", '"' or ".") or is one of the following words: or, and, return. Example: </p>
538 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
539 <p class="Code " style="vertical-align: 0.000000em; ">1 + 2</p>
540 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
541 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">This just gets compiled into the normal message: </p>
542 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
543 <p class="Code " style="vertical-align: 0.000000em; ">1 +(2)</p>
544 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
545 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Which is the form you can use if you need to do grouping: </p>
546 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
547 <p class="Code " style="vertical-align: 0.000000em; ">1 +(2 * 4)</p>
548 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
549 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Standard operators follow C's precedence order, so: </p>
550 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
551 <p class="Code " style="vertical-align: 0.000000em; ">1 + 2 * 3 + 4</p>
552 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
553 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Is parsed as: </p>
554 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
555 <p class="Code " style="vertical-align: 0.000000em; ">1 +(2 *(3)) +(4)</p>
556 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
557 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">User defined operators (that don't have a standard operator name) are performed left to right.</p>
558 <p class="Heading_1 ">
559 <a name="TOC7147" style="vertical-align: 0.000000em; " id="TOC7147">Assignment</a>
560 </p>
561 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Io has two assignment messages, &#x201C;:=&#x201D; and &#x201C;=&#x201D;. </p>
562 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
563 <p class="Code ">
564 <span style="vertical-align: 0.000000em; ">a := 1 </span>
565 <span style="vertical-align: 0.000000em; "></span>
566 </p>
567 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
568 <p class="Body " style="vertical-align: 0.000000em; ">which compiles to:</p>
569 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
570 <p class="Code " style="vertical-align: 0.000000em; ">setSlot(&#x201C;a&#x201D;, 1)</p>
571 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
572 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">which creates the slot in the current context. And:</p>
573 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
574 <p class="Code ">
575 <span style="vertical-align: 0.000000em; ">a = 1 </span>
576 <span style="vertical-align: 0.000000em; "></span>
577 </p>
578 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
579 <p class="Body " style="vertical-align: 0.000000em; ">which compiles to:</p>
580 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
581 <p class="Code " style="vertical-align: 0.000000em; ">updateSlot(&#x201C;a&#x201D;, 1)</p>
582 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
583 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">which sets the slot if it is found in the lookup path or raises an exception otherwise. By overloading updateSlot and forward in the Locals prototype, self is made implicit in methods.</p>
584 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
585 </div>
586 <div style="margin : 0pt 0pt 0pt 0pt; ">
587 <p></p>
588 <p style="padding-top: 0pt; " class="Heading_1 ">
589 <a name="TOC7540" style="vertical-align: 0.000000em; " id="TOC7540">Numbers</a>
590 </p>
591 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The following are valid number formats: </p>
592 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
593 <p class="Code " style="vertical-align: 0.000000em; ">123</p>
594 <p class="Code " style="vertical-align: 0.000000em; ">123.456</p>
595 <p class="Code " style="vertical-align: 0.000000em; ">0.456</p>
596 <p class="Code " style="vertical-align: 0.000000em; ">.456</p>
597 <p class="Code " style="vertical-align: 0.000000em; ">123e-4</p>
598 <p class="Code " style="vertical-align: 0.000000em; ">123e4</p>
599 <p class="Code " style="vertical-align: 0.000000em; ">123.456e-7</p>
600 <p class="Code " style="vertical-align: 0.000000em; ">123.456e2</p>
601 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
602 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Hex numbers are also supported (in any casing): </p>
603 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
604 <p class="Code " style="vertical-align: 0.000000em; ">0x0</p>
605 <p class="Code " style="vertical-align: 0.000000em; ">0x0F</p>
606 <p class="Code " style="vertical-align: 0.000000em; ">0XeE</p>
607 <p class="Heading_1 ">
608 <a name="TOC7712" style="vertical-align: 0.000000em; " id="TOC7712">Strings</a>
609 </p>
610 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
611 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Strings can be defined surrounded by a single set of double quotes with escaped quotes (and other escape characters) within. </p>
612 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
613 <p class="Code " style="vertical-align: 0.000000em; ">s := "this is a \"test\".\nThis is only a test."</p>
614 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
615 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Or for strings with non-escaped characters and/or spanning many lines, triple quotes can be used. </p>
616 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
617 <p class="Code " style="vertical-align: 0.000000em; ">s := """this is a "test".</p>
618 <p class="Code " style="vertical-align: 0.000000em; ">This is only a test."""</p>
619 <p class="Heading_1 ">
620 <a name="TOC8048" style="vertical-align: 0.000000em; " id="TOC8048">Comments</a>
621 </p>
622 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Comments of the //, /**/ and # style are supported. Examples: </p>
623 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
624 <p class="Code " style="vertical-align: 0.000000em; ">a := b // add a comment to a line</p>
625 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
626 <p class="Code " style="vertical-align: 0.000000em; ">/* comment out a group</p>
627 <p class="Code " style="vertical-align: 0.000000em; ">a := 1</p>
628 <p class="Code " style="vertical-align: 0.000000em; ">b := 2</p>
629 <p class="Code " style="vertical-align: 0.000000em; ">*/</p>
630 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
631 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The "#" style is useful for unix scripts: </p>
632 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
633 <p class="Code " style="vertical-align: 0.000000em; ">#!/usr/local/bin/io</p>
634 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
635 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">That's it! You now know everything there is to know about Io's syntax. Control flow, objects, methods, exceptions are expressed with the syntax and semantics described above. </p>
636 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
637 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
638 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
639 <p class="Heading "></p>
640 <p class="Heading ">
641 <a name="TOC8442" style="vertical-align: 0.000000em; " id="TOC8442">Objects</a>
642 </p>
643 <p class="Quote ">
644 <span style="color: #616161; vertical-align: 0.000000em; ">In all other languages we've considered [Fortran, Algol60, Lisp, APL, Cobol, Pascal], a program consists of passive data-objects on the one hand and the executable program that manipulates these passive objects on the other. Object-oriented programs replace this bipartite structure with a homogeneous one: they consist of a set of data systems, each of which is capable of operating on itself. - David Gelernter and Suresh J Jag</span>
645 <span style="vertical-align: 0.000000em; "></span>
646 </p>
647 <p class="Heading_1 ">
648 <a name="TOC8880" style="vertical-align: 0.000000em; " id="TOC8880">Overview</a>
649 </p>
650 <p class="Body " style="vertical-align: 0.000000em; ">Io&#x2019;s guiding design principle is simplicity and power through conceptual unification. </p>
651 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Times-Roman', 'Times'; font-size: 11.00pt; line-height: 1.18; visibility: hidden; " class="Body ">&#xA0;</p>
652 <div style="margin-bottom: 0.000000pt; margin-left: 89.65pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
653 <table cellspacing="0" style="background-color: transparent; border-collapse: collapse; " class="Table">
654 <tr>
655 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 58pt; vertical-align: top; width: 151pt; " class="Normal table_cell_style_default">
656 <div>
657 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-top: 0pt; text-indent: 0.00pt; " class="Body ">
658 <span style="color: #000000; font-style: italic; font-weight: bold; ">concept</span>
659 <span style="color: #000000; font-style: italic; font-weight: normal; "></span>
660 </p>
661 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; color: #000000; font-style: italic; font-weight: normal; " class="Body ">prototypes </p>
662 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; color: #000000; font-style: italic; font-weight: normal; " class="Body ">messages</p>
663 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; text-indent: 0.00pt; color: #000000; font-style: italic; font-weight: normal; " class="Body ">blocks with assignable scope</p>
664 </div>
665 </td>
666 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 58pt; vertical-align: top; width: 224pt; " class="Normal table_cell_style_default">
667 <div>
668 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; padding-top: 0pt; text-indent: 0.00pt; color: #000000; font-style: italic; font-weight: bold; " class="Body ">unifies</p>
669 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; color: #000000; font-style: italic; font-weight: normal; " class="Body ">objects, classes, namespaces, locals functions,</p>
670 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; color: #000000; font-style: italic; font-weight: normal; " class="Body ">operators, calls, assignment, variable accesses</p>
671 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; text-indent: 0.00pt; color: #000000; font-style: italic; font-weight: normal; " class="Body ">methods, closures, functions</p>
672 </div>
673 </td>
674 </tr>
675 </table>
676 <span style="font-family: 'Times-Roman', 'Times'; font-size: 11.00pt; line-height: 1.18; "></span>
677 </div>
678 <p class="Heading_1 ">
679 <a name="TOC8979" style="vertical-align: 0.000000em; " id="TOC8979">Prototypes</a>
680 </p>
681 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
682 <span>In Io, everything is an object</span>
683 <span> (</span>
684 <span>including the locals storage of a block and the namesp</span>
685 <span>ace itself) and a</span>
686 <span>ll actions are messages</span>
687 <span> (</span>
688 <span>including assignment). </span>
689 <span>Objects are composed of a list of key/value pairs called slots, </span>
690 <span>and an internal list of objects from which it inherits called protos. </span>
691 <span>A slot&#x2019;s key is a symbol (a unique immutable sequence) and it&#x2019;s value can be any type of object.</span>
692 </p>
693 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">&#xA0;</p>
694 <p class="Heading_2 " style="vertical-align: 0.000000em; ">clone and init</p>
695 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">New objects are made by cloning existing ones. A clone is an empty object that has the parent in it&#x2019;s list of protos. A new instance&#x2019;s init slot will be activated which gives the object a chance to initialize itself. Like NewtonScript[3], slots in Io are create-on-write.</p>
696 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
697 <p class="Code " style="vertical-align: 0.000000em; ">me := Person clone</p>
698 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
699 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">To add an instance variable or method, simply set it: </p>
700 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
701 <p class="Code " style="vertical-align: 0.000000em; ">myDog name := "rover"</p>
702 <p class="Code " style="vertical-align: 0.000000em; ">myDog sit := method("I'm sitting\n" print)</p>
703 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
704 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">When an object is cloned, its "init" slot will be called if it has one.</p>
705 <p class="Heading_1 ">
706 <a name="TOC9876" style="vertical-align: 0.000000em; " id="TOC9876">Inheritance</a>
707 </p>
708 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
709 <span>When an object receives a message it looks for a matching slot, if not found, the lookup continues depth first recursively in its protos. Lookup loops are detected (at runtime) and avoided. If the matching slot contains an activatable object, such as a Block or CFunction, it is activated, if it contains any other type of value it returns the value. Io has no globals </span>
710 <span>and the root object in the Io namespace is called the Lobby.</span>
711 </p>
712 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
713 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Since there are no classes, there's no difference between a subclass and an instance. Here&#x2019;s an example of creating a the equivalent of a subclass: </p>
714 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
715 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; Dog := Object clone</p>
716 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; Object_0x4a7c0 </p>
717 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
718 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The above code sets the Lobby slot "Dog" to a clone of the Object object. Notice it only contains a protos list contains a reference to Object. Dog is now essentially a subclass of Object. Instance variables and methods are inherited from the proto. If a slot is set, it creates a new slot in our object instead of changing the proto: </p>
719 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
720 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;Io&gt; Dog color := "red"</p>
721 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;Io&gt; Dog</p>
722 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;==&gt; Object_0x4a7c0:</p>
723 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0; &#xA0;color := "red"</p>
724 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Multiple Inheritance</p>
725 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">You can add any number of protos to an object's protos list. When responding to a message, the lookup mechanism does a depth first search of the proto chain.</p>
726 <p class="Heading_1 ">
727 <a name="TOC11106" style="vertical-align: 0.000000em; " id="TOC11106">Methods</a>
728 </p>
729 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">A method is an anonymous function which, when called, creates an object to store it's locals and sets the local&#x2019;s proto pointer and it&#x2019;s self slot to the target of the message. The Object method method() can be used to create methods. Example:</p>
730 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
731 <p class="Code " style="vertical-align: 0.000000em; ">method((2 + 2) print)</p>
732 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
733 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">An example of using a method in an object: </p>
734 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
735 <p class="Code " style="vertical-align: 0.000000em; ">Dog := Object clone</p>
736 <p class="Code " style="vertical-align: 0.000000em; ">Dog bark := method("woof!" print)</p>
737 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
738 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The above code creates a new "subclass" of object named Dog and adds a bark slot containing a block that prints "woof!". Example of calling this method:</p>
739 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
740 <p class="Code " style="vertical-align: 0.000000em; ">Dog bark</p>
741 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
742 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The default return value of a block is the &#xA0;result of the last expression.</p>
743 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Arguments</p>
744 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Methods can also be defined to take arguments. Example: </p>
745 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
746 <p class="Code " style="vertical-align: 0.000000em; ">add := method(a, b, a + b)</p>
747 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
748 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The general form is: </p>
749 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; visibility: hidden; " class="Body ">&#xA0;</p>
750 <p class="PsuedoCode " style="vertical-align: 0.000000em; ">method(&lt;arg name 0&gt;, &lt;arg name 1&gt;, ..., &lt;do message&gt;)</p>
751 <p class="PsuedoCode " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
752 </div>
753 <div style="margin : 0pt 0pt 0pt 0pt; ">
754 <p></p>
755 <p style="padding-top: 0pt; " class="Heading_1 ">
756 <a name="TOC11896" id="TOC11896">
757 <span style="vertical-align: 0.000000em; ">Blocks</span>
758 <span style="vertical-align: 0.000000em; "></span>
759 </a>
760 </p>
761 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">A block is the same as a method except it is lexically scoped. That is, variable lookups continue in the context of where the block was created instead of the target of the message which activated the block. A block can be created using the Object method block(). Example of creating a block:</p>
762 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
763 <p class="Code " style="vertical-align: 0.000000em; ">b := block(a, a + b)</p>
764 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-top: 22.000000pt; " class="Heading_2 ">Blocks vs. Methods</p>
765 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">This is sometimes a source of confusion so it's worth explaining in detail. Both methods and blocks create an object to hold their locals when they are called. The difference is what the "proto" and "self" slots of that locals object are set to. In a method, those slots are set to the target of the message. In a block, they're set to the locals object where the block was created. So a failed variable lookup in a block's locals continue in the locals where it was created. And a failed variable lookup in a method's locals continue in the object to which the message that activated it was sent.</p>
766 <p class="Heading_2 " style="vertical-align: 0.000000em; ">call and self slots</p>
767 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">When a locals object is created, it&#x2019;s self slot is set (to the target of the message, in the case of a method, or to the creation context, in the case of a block) and it&#x2019;s call slot is set to a Call object that can be used to access information about the block activation:</p>
768 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
769 <div style="margin-bottom: 0.000000pt; margin-left: 89.65pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
770 <table cellspacing="0" style="background-color: transparent; border-collapse: collapse; " class="Table">
771 <tr>
772 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 82pt; vertical-align: top; width: 90pt; " class="Normal table_cell_style_default">
773 <div>
774 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-top: 0pt; text-indent: 0.00pt; " class="Body ">
775 <span style="font-style: italic; font-weight: bold; ">slot</span>
776 <span style="font-style: italic; font-weight: normal; "></span>
777 </p>
778 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">call sender </p>
779 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">call message </p>
780 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">call activated</p>
781 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">call slotContext</p>
782 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">call target</p>
783 </div>
784 </td>
785 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 82pt; vertical-align: top; width: 212pt; " class="Normal table_cell_style_default">
786 <div>
787 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; padding-top: 0pt; text-indent: 0.00pt; font-style: italic; font-weight: bold; " class="Body ">returns</p>
788 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">locals object of caller</p>
789 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">message used to call this method/block</p>
790 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">the activated method/block</p>
791 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">context in which slot was found</p>
792 <p style="margin-bottom: 0.000000pt; margin-left: 1.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; text-indent: 0.00pt; font-style: italic; font-weight: normal; " class="Body ">current object</p>
793 </div>
794 </td>
795 </tr>
796 </table>
797 </div>
798 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Variable Arguments</p>
799 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The &#x201C;call message&#x201D; slot in locals can be used to access the unevaluated argument messages. Example of implementing if() within Io: </p>
800 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
801 <p class="Code " style="vertical-align: 0.000000em; ">if := method(</p>
802 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;(call sender doMessage(call message argAt(0))) ifTrue( </p>
803 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0; call sender doMessage(call message argAt(1))) ifFalse( </p>
804 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0; call sender doMessage(call message argAt(2)))</p>
805 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
806 <p class="Code " style="vertical-align: 0.000000em; ">myif(foo == bar, write("true\n"), write("false\n"))</p>
807 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
808 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The doMessage() method evaluates the argument in the context of the receiver.</p>
809 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
810 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">A shorter way to express this is to use the evalArgAt() method on the call object:</p>
811 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
812 <p class="Code " style="vertical-align: 0.000000em; ">if := method(</p>
813 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;call evalArgAt(0) ifTrue(</p>
814 <p class="Code ">
815 <span style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;</span>
816 <span style="vertical-align: 0.000000em; ">call evalArgAt(</span>
817 <span style="vertical-align: 0.000000em; ">1</span>
818 <span style="vertical-align: 0.000000em; ">)</span>
819 <span style="vertical-align: 0.000000em; ">) ifFalse( </span>
820 </p>
821 <p class="Code ">
822 <span style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;</span>
823 <span style="vertical-align: 0.000000em; ">call evalArgAt(</span>
824 <span style="vertical-align: 0.000000em; ">2</span>
825 <span style="vertical-align: 0.000000em; ">)</span>
826 <span style="vertical-align: 0.000000em; ">)</span>
827 </p>
828 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
829 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
830 <p class="Code " style="vertical-align: 0.000000em; ">myif(foo == bar, write("true\n"), write("false\n"))</p>
831 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
832 <p class="Heading_1 ">
833 <a name="TOC13825" style="vertical-align: 0.000000em; " id="TOC13825">Forward</a>
834 </p>
835 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">If an object doesn't respond to a message, it will invoke its "forward" method if it has one. Here&#x2019;s an example of how to print the information related lookup that failed:</p>
836 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
837 <p class="Code " style="vertical-align: 0.000000em; ">MyObject forward := method(</p>
838 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;write("sender = ", call sender, "\n")</p>
839 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;write("message name = ", call message name, "\n")</p>
840 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;args := call message argsEvaluatedIn(call sender)</p>
841 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;args foreach(i, v, write("arg", i, " = ", v, "\n") )</p>
842 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
843 <p style="margin-bottom: 0.000000pt; margin-left: 71.65pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Heading_1 ">
844 <a name="TOC14231" id="TOC14231">Resend</a>
845 </p>
846 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Sends the current message to the receiver's proto with the context of self. Example: </p>
847 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
848 <p class="Code " style="vertical-align: 0.000000em; ">A := Object clone</p>
849 <p class="Code " style="vertical-align: 0.000000em; ">A m := method(write("in A\n"))</p>
850 <p class="Code " style="vertical-align: 0.000000em; ">B := A clone</p>
851 <p class="Code " style="vertical-align: 0.000000em; ">B m := method(write("in B\n"); resend)</p>
852 <p class="Code " style="vertical-align: 0.000000em; ">B m</p>
853 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
854 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">will print: </p>
855 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
856 <p class="Code " style="vertical-align: 0.000000em; ">in B</p>
857 <p class="Code " style="vertical-align: 0.000000em; ">in A</p>
858 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
859 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">For sending other messages to the receiver's proto, super is used.</p>
860 <p class="Heading_1 ">
861 <a name="TOC14523" style="vertical-align: 0.000000em; " id="TOC14523">Super</a>
862 </p>
863 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Sometimes it's necessary to send a message directly to a proto. Example: </p>
864 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
865 <p class="Code " style="vertical-align: 0.000000em; ">Dog := Object clone</p>
866 <p class="Code " style="vertical-align: 0.000000em; ">Dog bark := method(writeln("woof!"))</p>
867 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
868 <p class="Code " style="vertical-align: 0.000000em; ">fido := Dog clone</p>
869 <p class="Code " style="vertical-align: 0.000000em; ">fido bark := method(</p>
870 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;writeln("ruf!")</p>
871 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;super(bark)</p>
872 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
873 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
874 <p class="Body " style="vertical-align: 0.000000em; ">Both resend and super are implemented in Io.</p>
875 </div>
876 <div style="margin : 0pt 0pt 0pt 0pt; ">
877 <p></p>
878 <p style="padding-top: 0pt; vertical-align: 0.000000em; visibility: hidden; " class="Heading_1 ">&#xA0;</p>
879 <p class="Heading_1 ">
880 <a name="TOC14781" style="vertical-align: 0.000000em; " id="TOC14781">Introspection</a>
881 </p>
882 <p class="Body " style="vertical-align: 0.000000em; ">Using the following methods you can introspect the entire Io namespace. There are also methods for modifying any and all of these attributes at runtime.</p>
883 <p class="Heading_2 " style="vertical-align: 0.000000em; ">slotNames</p>
884 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The slotNames method returns a list of the names of an object&#x2019;s slots:</p>
885 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
886 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; Dog slotNames</p>
887 <p class="Code ">
888 <span style="vertical-align: 0.000000em; ">==&gt; list(&#x201C;bark&#x201D;)</span>
889 <span style="font-family: 'Helvetica-Bold', 'Helvetica'; font-size: 11.00pt; font-weight: bold; line-height: 1.18; vertical-align: 0.000000em; "></span>
890 </p>
891 <p class="Heading_2 ">
892 <span style="vertical-align: 0.000000em; ">protos</span>
893 <span style="font-family: 'Helvetica-Bold', 'Helvetica'; font-size: 11.00pt; font-weight: bold; line-height: 1.18; vertical-align: 0.000000em; "></span>
894 </p>
895 <p class="Body " style="vertical-align: 0.000000em; ">The protos method returns a list of the objects which an object inherits from:</p>
896 <p class="Body " style="font-family: 'Helvetica-Bold', 'Helvetica'; font-size: 11.00pt; font-weight: bold; line-height: 1.18; vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
897 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; Dog protos</p>
898 <p class="Code ">
899 <span style="vertical-align: 0.000000em; ">==&gt; list(&#x201C;Object&#x201D;)</span>
900 <span style="font-family: 'Helvetica-Bold', 'Helvetica'; font-size: 11.00pt; font-weight: bold; line-height: 1.18; vertical-align: 0.000000em; "></span>
901 </p>
902 <p class="Heading_2 ">
903 <span style="font-family: 'Helvetica-Bold', 'Helvetica'; font-size: 11.00pt; font-weight: bold; line-height: 1.18; vertical-align: 0.000000em; ">getSlot</span>
904 <span style="vertical-align: 0.000000em; "></span>
905 </p>
906 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
907 <span>T</span>
908 <span>he "getSlot" method</span>
909 <span> can be used to get the value of a block in a slot without activating it: </span>
910 </p>
911 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
912 <p class="Code " style="vertical-align: 0.000000em; ">myMethod := Dog getSlot("bark")</p>
913 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
914 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
915 <span>Above, we've set the locals object&#x2019;s "myMethod" slot to the bark method. It's important to remember that if you then want use the </span>
916 <span>myMethod</span>
917 <span> without activating it, you'll need to use the getSlot method: </span>
918 </p>
919 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
920 <p class="Code " style="vertical-align: 0.000000em; ">otherObject newMethod := getSlot("myMethod")</p>
921 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
922 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Here, the target of the getSlot method is the locals object.</p>
923 <p class="Heading_2 " style="vertical-align: 0.000000em; ">code</p>
924 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The arguments and expressions of methods are open to introspection. A useful convenience method is &#x201C;code&#x201D;, which returns a string representation of the source code of the method in a normalized form.</p>
925 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
926 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; method(a, a * 2) code</p>
927 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; &#x201C;method(a, a *(2))&#x201D;</p>
928 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
929 <p class="Body "></p>
930 <p class="Heading ">
931 <a name="TOC15891" style="vertical-align: 0.000000em; " id="TOC15891">Control Flow</a>
932 </p>
933 <p class="Heading_1 ">
934 <a name="TOC15904" style="vertical-align: 0.000000em; " id="TOC15904">true, false and nil</a>
935 </p>
936 <p class="Body ">
937 <span style="vertical-align: 0.000000em; ">Io has predefined</span>
938 <span style="vertical-align: 0.000000em; "> singletons </span>
939 <span style="vertical-align: 0.000000em; ">for true, false and nil. true and false are used for boolean truth values and nil is typically used to indicate an unset or missing or unavailable value.</span>
940 </p>
941 <p class="Heading_1 ">
942 <a name="TOC16107" style="vertical-align: 0.000000em; " id="TOC16107">Comparison</a>
943 </p>
944 <p class="Body " style="vertical-align: 0.000000em; ">The standard comparison operations (==, !=, &gt;=, &lt;=, &gt;, &lt;) return either the true or false.</p>
945 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
946 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; 1 &lt; 2</p>
947 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; true</p>
948 <p class="Heading_1 ">
949 <a name="TOC16229" style="vertical-align: 0.000000em; " id="TOC16229">Conditions</a>
950 </p>
951 <p class="Heading_2 " style="vertical-align: 0.000000em; ">if</p>
952 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The Lobby contains the condition and loop methods. A condition looks like: </p>
953 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
954 <p class="PsuedoCode " style="vertical-align: 0.000000em; ">if(&lt;condition&gt;, &lt;do message&gt;, &lt;else do message&gt;)</p>
955 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; visibility: hidden; " class="Body ">&#xA0;</p>
956 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Example: </p>
957 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
958 <p class="Code " style="vertical-align: 0.000000em; ">if(a == 10, "a is 10" print)</p>
959 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
960 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The else argument is optional. The condition is considered false if the condition expression evaluates to false or nil, and is considered true otherwise.</p>
961 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The result of the evaluated message is returned, so: </p>
962 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
963 <p class="Code " style="vertical-align: 0.000000em; ">if(y &lt; 10, x := y, x := 0)</p>
964 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
965 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">is the same as: </p>
966 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
967 <p class="Code " style="vertical-align: 0.000000em; ">x := if(y &lt; 10, y, 0)</p>
968 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
969 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Conditions can also be used in this form (though not as efficiently): </p>
970 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
971 <p class="Code " style="vertical-align: 0.000000em; ">if(y &lt; 10) then(x := y) else(x := 2)</p>
972 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
973 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Else-if is supported: </p>
974 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
975 <p class="Code " style="font-size: 9.00pt; vertical-align: 0.000000em; ">if(y &lt; 10) then(x := y) elseif(y == 11) then(x := 0) else(x := 2)</p>
976 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
977 <p class="Body " style="vertical-align: 0.000000em; ">As well as Smalltalk style ifTrue, ifFalse, ifNil and ifNonNil methods:</p>
978 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
979 <p class="Code " style="vertical-align: 0.000000em; ">(y &lt; 10) ifTrue(x := y) ifFalse(x := 2)</p>
980 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
981 <p class="Body " style="vertical-align: 0.000000em; ">Notice that the condition expression must have parenthesis surrounding it.</p>
982 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
983 </div>
984 <div style="margin : 0pt 0pt 0pt 0pt; ">
985 <p></p>
986 <p style="padding-top: 0pt; " class="Heading_1 ">
987 <a name="TOC17081" style="vertical-align: 0.000000em; " id="TOC17081">Loops</a>
988 </p>
989 <p class="Heading_2 " style="vertical-align: 0.000000em; ">loop</p>
990 <p class="Body " style="vertical-align: 0.000000em; ">The loop method can be used for &#x201C;infinite&#x201D; loops:</p>
991 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
992 <p class="Code " style="vertical-align: 0.000000em; ">loop(&#x201C;foo&#x201D; println)</p>
993 <p class="Heading_2 " style="vertical-align: 0.000000em; ">while</p>
994 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Like conditions, loops are just messages. while() takes the arguments: </p>
995 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
996 <p class="PsuedoCode " style="vertical-align: 0.000000em; ">while(&lt;condition&gt;, &lt;do message&gt;)</p>
997 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
998 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Example: </p>
999 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1000 <p class="Code " style="vertical-align: 0.000000em; ">a := 1</p>
1001 <p class="Code " style="vertical-align: 0.000000em; ">while(a &lt; 10, </p>
1002 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;a print</p>
1003 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;a = a + 1</p>
1004 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1005 <p class="Heading_2 " style="vertical-align: 0.000000em; ">for</p>
1006 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">for() takes the arguments: </p>
1007 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1008 <p class="PsuedoCode " style="vertical-align: 0.000000em; ">for(&lt;counter&gt;, &lt;start&gt;, &lt;end&gt;, &lt;optional step&gt;, &lt;do message&gt;)</p>
1009 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1010 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The start and end messages are only evaluated once, when the loop starts.</p>
1011 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1012 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Example: </p>
1013 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1014 <p class="Code " style="vertical-align: 0.000000em; ">for(a, 0, 10, </p>
1015 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;a println</p>
1016 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1017 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1018 <p class="Body " style="vertical-align: 0.000000em; ">Example with a step:</p>
1019 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1020 <p class="Code " style="vertical-align: 0.000000em; ">for(x, 0, 10, 3, x println)</p>
1021 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1022 <p class="Body " style="vertical-align: 0.000000em; ">Which would print:</p>
1023 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1024 <p class="Code " style="vertical-align: 0.000000em; ">0</p>
1025 <p class="Code " style="vertical-align: 0.000000em; ">3</p>
1026 <p class="Code " style="vertical-align: 0.000000em; ">6</p>
1027 <p class="Code " style="vertical-align: 0.000000em; ">9</p>
1028 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1029 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">To reverse the order of the loop, add a negative step: </p>
1030 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1031 <p class="Code " style="vertical-align: 0.000000em; ">for(a, 10, 0, -1, a println)</p>
1032 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1033 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Note: the first value will be the first value of the loop variable and the last will be the last value on the final pass through the loop. So a loop of 1 to 10 will loop 10 times and a loop of 0 to 10 will loop 11 times.</p>
1034 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1035 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Example of using a block in a loop: </p>
1036 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1037 <p class="Code " style="vertical-align: 0.000000em; ">test := method(v, v print)</p>
1038 <p class="Code " style="vertical-align: 0.000000em; ">for(i, 1, 10, test(i))</p>
1039 <p class="Heading_2 " style="vertical-align: 0.000000em; ">repeat</p>
1040 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The Number repeat method is simpler and more efficient when a counter isn&#x2019;t needed.</p>
1041 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1042 <p class="Code " style="vertical-align: 0.000000em; ">3 repeat(&#x201C;foo&#x201D; print)</p>
1043 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; foofoofoo</p>
1044 <p class="Heading_2 " style="vertical-align: 0.000000em; ">break and continue</p>
1045 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The flow control operations break and continue are supported in loops. For example: </p>
1046 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1047 <p class="Code " style="vertical-align: 0.000000em; ">for(i, 1, 10, </p>
1048 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;if(i == 3, continue)</p>
1049 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;if(i == 7, break)</p>
1050 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;i print</p>
1051 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1052 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1053 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Would print: </p>
1054 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1055 <p class="Code " style="vertical-align: 0.000000em; ">12456</p>
1056 <p class="Heading_2 ">
1057 <span style="color: #5f5f5f; vertical-align: 0.000000em; ">return</span>
1058 <span style="vertical-align: 0.000000em; "></span>
1059 </p>
1060 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Any part of a block can return immediately using the return method. Example: </p>
1061 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1062 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; test := method(123 print; return "abc"; 456 print)</p>
1063 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; test</p>
1064 <p class="Code " style="vertical-align: 0.000000em; ">123</p>
1065 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; abc</p>
1066 <p class="Heading_1 ">
1067 <a name="TOC18503" style="vertical-align: 0.000000em; " id="TOC18503">Importing</a>
1068 </p>
1069 <p style="padding-bottom: 0pt; vertical-align: 0.000000em; " class="Body ">The Importer proto implements Io&#x2019;s built-in auto importer feature. If you put each of your proto&#x2019;s in their own file, and give the file the same name with and &#x201C;.io&#x201D; extension, the Importer will automatically import that file when the proto is first referenced. The Importer&#x2019;s default search path is the current working directory, but can add search paths using it&#x2019;s addSearchPath() method. </p>
1070 </div>
1071 <div style="margin : 0pt 0pt 0pt 0pt; ">
1072 <p></p>
1073 <p style="padding-top: 0pt; vertical-align: 0.000000em; visibility: hidden; " class="Body ">&#xA0;</p>
1074 <p class="Heading ">
1075 <a name="TOC18905" style="vertical-align: 0.000000em; " id="TOC18905">Concurrency</a>
1076 </p>
1077 <p class="Heading_1 ">
1078 <a name="TOC18917" style="vertical-align: 0.000000em; " id="TOC18917">Coroutines</a>
1079 </p>
1080 <p class="Body ">
1081 <span style="vertical-align: 0.000000em; ">Io uses coroutines (</span>
1082 <span style="vertical-align: 0.000000em; ">user level cooperative threads)</span>
1083 <span style="vertical-align: 0.000000em; ">, instead of preemptive OS level threads to implement concurrency. This avoids the substantial costs (memory, system calls, locking, caching issues, etc) associated with native threads and allows Io to support a very high level of concurrency with thousands of active threads.</span>
1084 </p>
1085 <p class="Heading_1 ">
1086 <a name="TOC19256" style="vertical-align: 0.000000em; " id="TOC19256">Scheduler</a>
1087 </p>
1088 <p class="Body " style="vertical-align: 0.000000em; ">The Scheduler object is responsible for resuming coroutines that are yielding. The current scheduling system uses a simple first-in-first-out policy with no priorities.</p>
1089 <p class="Heading_1 ">
1090 <a name="TOC19435" style="vertical-align: 0.000000em; " id="TOC19435">Actors</a>
1091 </p>
1092 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">An actor is an object with it's own thread (in our case, it&#x2019;s own coroutine) which it uses to process it's queue of asynchronous messages. Any object in Io can be sent an asynchronous message by placing a @ or @@ before the message name. (think of the "a" in @ as standing for "asynchronous") </p>
1093 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1094 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Example:</p>
1095 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1096 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;result := self foo // synchronous </p>
1097 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;futureResult := self @foo // async, immediately returns a Future</p>
1098 <p style="line-height: 0.01; margin-bottom: 0.000000pt; margin-top: 0.000000pt; " class="Code ">&#xA0;&#xA0;self @@foo // async, immediately returns nil</p>
1099 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1100 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1101 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">When an object receives an asynchronous message it puts the message in its queue and, if it doesn't already have one, starts a coroutine to process the messages in its queue. Queued messages are processed sequentially in a first-in-first-out order. Control can be yielded to other coroutines by calling "yield". Example: </p>
1102 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1103 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;obj1 := Object clone</p>
1104 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;obj1 test := method(for(n, 1, 3, n print; yield))</p>
1105 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;obj2 := obj1 clone</p>
1106 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;obj1 @@test; obj2 @@test</p>
1107 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;while(Scheduler activeActorCount &gt; 1, yield)</p>
1108 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1109 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">This would print "112233".</p>
1110 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1111 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Here's a more real world example: </p>
1112 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1113 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;HttpServer handleRequest := method(aSocket,</p>
1114 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0; &#xA0;HttpRequestHandler clone @@handleRequest(aSocket)</p>
1115 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;)</p>
1116 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1117 </div>
1118 <div style="margin : 0pt 0pt 0pt 0pt; ">
1119 <p></p>
1120 <p style="padding-top: 0pt; " class="Heading_1 ">
1121 <a name="TOC20564" style="vertical-align: 0.000000em; " id="TOC20564">Yield</a>
1122 </p>
1123 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">An object will automatically yield between processing each of its asynchronous messages. The yield method only needs to be called if a yield is required during an asynchronous message execution. </p>
1124 <p class="Heading_1 ">
1125 <a name="TOC20766" style="vertical-align: 0.000000em; " id="TOC20766">Pause and Resume</a>
1126 </p>
1127 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">It's also possible to pause and resume an object. See the concurrency methods of the Object primitive for details and related methods.</p>
1128 <p class="Heading_1 ">
1129 <a name="TOC20918" style="vertical-align: 0.000000em; " id="TOC20918">Futures</a>
1130 </p>
1131 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Io's futures are transparent. That is, when the result is ready, they become the result. If a message is sent to a future (besides the two methods it implements), it waits until it turns into the result before processing the message. Transparent futures are powerful because they allow programs minimize blocking while also freeing the programmer from managing the fine details of synchronization.</p>
1132 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Auto Deadlock Detection</p>
1133 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">
1134 <span>An advantage of using futures is that when a future requires a wait, it will check to see if pausing to wait for the result would cause a deadlock and if so, avoid the deadlock and raise an exception. I</span>
1135 <span>t </span>
1136 <span>performs</span>
1137 <span> this check by travers</span>
1138 <span>ing</span>
1139 <span> the list of connected future</span>
1140 <span>s</span>
1141 <span>.</span>
1142 </p>
1143 <p class="Heading_2 " style="vertical-align: 0.000000em; ">The @ and @@ Operators</p>
1144 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The @ or @@ before an asynchronous message is just a normal operator message. So: </p>
1145 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1146 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;self @test</p>
1147 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1148 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Gets parsed as(and can be written as): </p>
1149 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1150 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;self @(test)</p>
1151 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1152 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1153 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1154 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1155 <p class="Heading "></p>
1156 <p class="Heading ">
1157 <a name="TOC21799" style="vertical-align: 0.000000em; " id="TOC21799">Exceptions</a>
1158 </p>
1159 <p class="Heading_1 ">
1160 <a name="TOC21810" style="vertical-align: 0.000000em; " id="TOC21810">Raise</a>
1161 </p>
1162 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">An exception can be raised by calling raise() on an exception proto. </p>
1163 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1164 <p class="PsuedoCode " style="vertical-align: 0.000000em; ">exceptionProto raise(&lt;description&gt;)</p>
1165 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-style: italic; visibility: hidden; " class="Body ">&#xA0;</p>
1166 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">There are three predefined children of the Exception proto: Error, Warning and Notification. Examples: </p>
1167 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1168 <p class="Code " style="vertical-align: 0.000000em; ">Exception raise("generic foo exception")</p>
1169 <p class="Code " style="vertical-align: 0.000000em; ">Warning raise("No defaults found, creating them")</p>
1170 <p class="Code " style="vertical-align: 0.000000em; ">Error raise("Not enough memory")</p>
1171 <p class="Heading_1 ">
1172 <a name="TOC22153" style="vertical-align: 0.000000em; " id="TOC22153">Try and Catch</a>
1173 </p>
1174 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">To catch an exception, the try() method of the Object proto is used. try() will catch any exceptions that occur within it and return the caught exception or nil if no exception is caught. </p>
1175 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1176 <p class="Code " style="vertical-align: 0.000000em; ">e := try(&lt;doMessage&gt;)</p>
1177 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1178 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">To catch a particular exception, the Exception catch() method can be used. Example:</p>
1179 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1180 <p class="Code " style="vertical-align: 0.000000em; ">e := try(</p>
1181 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0; &#xA0;// ...</p>
1182 <p class="Code " style="vertical-align: 0.000000em; ">) </p>
1183 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1184 <p class="Code " style="vertical-align: 0.000000em; ">e catch(Exception,</p>
1185 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0; &#xA0;writeln(e coroutine backtraceString)</p>
1186 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1187 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1188 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">The first argument to catch indicates which types of exceptions will be caught. catch() returns the exception if it doesn't match and nil if it does.</p>
1189 <p class="Heading_1 ">
1190 <a name="TOC22703" style="vertical-align: 0.000000em; " id="TOC22703">Pass</a>
1191 </p>
1192 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">To re-raise an exception caught by try(), use the pass method. This is useful to pass the exception up to the next outer exception handler, usually after all catches failed to match the type of the current exception: </p>
1193 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1194 <p class="Code " style="vertical-align: 0.000000em; ">e := try(</p>
1195 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;// ...</p>
1196 <p class="Code " style="vertical-align: 0.000000em; ">) </p>
1197 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1198 <p class="Code " style="vertical-align: 0.000000em; ">e catch(Error,</p>
1199 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;// ...</p>
1200 <p class="Code " style="vertical-align: 0.000000em; ">) catch(Exception,</p>
1201 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;// ...</p>
1202 <p class="Code " style="vertical-align: 0.000000em; ">) pass</p>
1203 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1204 </div>
1205 <div style="margin : 0pt 0pt 0pt 0pt; ">
1206 <p></p>
1207 <p style="padding-top: 0pt; " class="Heading_1 ">
1208 <a name="TOC23008" style="vertical-align: 0.000000em; " id="TOC23008">Custom Exceptions</a>
1209 </p>
1210 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Custom exception types can be implemented by simply cloning an existing Exception type: </p>
1211 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;MyErrorType := Error clone</p>
1212 <p class="Heading_1 " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1213 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1214 <p class="Body "></p>
1215 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1216 <p class="Heading ">
1217 <a name="TOC23148" style="vertical-align: 0.000000em; " id="TOC23148">Primitives</a>
1218 </p>
1219 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Primitives are objects built into Io whose methods are typically implemented in C and store some hidden data in their instances. For example, the Number primitive has a double precision floating point number as it's hidden data and it&#x2019;s methods that do arithmetic operations are C functions. All Io primitives inherit from the Object prototype and are mutable. That is, their methods can be changed. The reference docs contain more info on primitives.</p>
1220 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1221 <p class="Body ">
1222 <span style="vertical-align: 0.000000em; ">This document is not meant as a reference manual, but an </span>
1223 <span style="vertical-align: 0.000000em; ">overview</span>
1224 <span style="vertical-align: 0.000000em; "> of the base primitives and bindings is provided here to give the user a jump start and a feel for what is available and where to look in the reference documentation for further details.</span>
1225 </p>
1226 <p class="Heading_1 ">
1227 <a name="TOC23864" style="vertical-align: 0.000000em; " id="TOC23864">Object</a>
1228 </p>
1229 <p class="Heading_2 " style="vertical-align: 0.000000em; ">The ? Operator</p>
1230 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Sometimes it's desirable to conditionally call a method only if it exists (to avoid raising an exception). Example: </p>
1231 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1232 <p class="Code " style="vertical-align: 0.000000em; ">if(obj getSlot("foo"), obj foo)</p>
1233 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1234 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Putting a "?" before a message has the same effect: </p>
1235 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1236 <p class="Code ">
1237 <span style="vertical-align: 0.000000em; ">obj ?foo</span>
1238 <span style="vertical-align: 0.000000em; "></span>
1239 </p>
1240 <p class="Heading_1 ">
1241 <a name="TOC24100" style="vertical-align: 0.000000em; " id="TOC24100">List</a>
1242 </p>
1243 <p class="Body " style="vertical-align: 0.000000em; ">A List is an array of references and supports all the standard array manipulation and enumeration methods. Examples:</p>
1244 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1245 <p class="Body " style="vertical-align: 0.000000em; ">Create an empty list:</p>
1246 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1247 <p class="Code " style="vertical-align: 0.000000em; ">a := List clone</p>
1248 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1249 <p class="Body ">
1250 <span style="vertical-align: 0.000000em; ">Create a list of arbitrary objects</span>
1251 <span style="vertical-align: 0.000000em; "> using the list() method: </span>
1252 </p>
1253 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1254 <p class="Code ">
1255 <span style="vertical-align: 0.000000em; ">a := list(33, </span>
1256 <span style="vertical-align: 0.000000em; ">"a"</span>
1257 <span style="vertical-align: 0.000000em; ">)</span>
1258 <span style="vertical-align: 0.000000em; "></span>
1259 </p>
1260 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1261 <p class="Body " style="vertical-align: 0.000000em; ">Append an item:</p>
1262 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1263 <p class="Code " style="vertical-align: 0.000000em; ">a append(&#x201C;b&#x201D;)</p>
1264 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list(33, &#x201C;a&#x201D;, &#x201C;b&#x201D;)</p>
1265 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1266 <p class="Body " style="vertical-align: 0.000000em; ">Get the list size:</p>
1267 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1268 <p class="Code " style="vertical-align: 0.000000em; ">a size</p>
1269 <p class="Code ">
1270 <span style="vertical-align: 0.000000em; ">==&gt; 3</span>
1271 <span style="vertical-align: 0.000000em; "></span>
1272 </p>
1273 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1274 <p class="Body ">
1275 <span style="vertical-align: 0.000000em; ">Get</span>
1276 <span style="vertical-align: 0.000000em; "> the</span>
1277 <span style="vertical-align: 0.000000em; "> item at </span>
1278 <span style="vertical-align: 0.000000em; ">a given index (</span>
1279 <span style="vertical-align: 0.000000em; ">List indexes begin at zero</span>
1280 <span style="vertical-align: 0.000000em; ">)</span>
1281 <span style="vertical-align: 0.000000em; ">:</span>
1282 </p>
1283 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1284 <p class="Code " style="vertical-align: 0.000000em; ">a at(1)</p>
1285 <p class="Code ">
1286 <span style="vertical-align: 0.000000em; ">==&gt; "</span>
1287 <span style="vertical-align: 0.000000em; ">a</span>
1288 <span style="vertical-align: 0.000000em; ">"</span>
1289 </p>
1290 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1291 <p class="Body ">
1292 <span style="vertical-align: 0.000000em; ">Note: List indexes begin at zero and nil is returned if the accessed index doesn&#x2019;t exist.</span>
1293 <span style="vertical-align: 0.000000em; "></span>
1294 </p>
1295 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1296 <p class="Body ">
1297 <span style="vertical-align: 0.000000em; ">S</span>
1298 <span style="vertical-align: 0.000000em; ">et</span>
1299 <span style="vertical-align: 0.000000em; "> the</span>
1300 <span style="vertical-align: 0.000000em; "> item at </span>
1301 <span style="vertical-align: 0.000000em; ">a given index</span>
1302 <span style="vertical-align: 0.000000em; ">:</span>
1303 </p>
1304 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1305 <p class="Code ">
1306 <span style="vertical-align: 0.000000em; ">a atPut(2, "</span>
1307 <span style="vertical-align: 0.000000em; ">foo</span>
1308 <span style="vertical-align: 0.000000em; ">")</span>
1309 </p>
1310 <p class="Code ">
1311 <span style="vertical-align: 0.000000em; ">==&gt; list(</span>
1312 <span style="vertical-align: 0.000000em; ">33</span>
1313 <span style="vertical-align: 0.000000em; ">, "</span>
1314 <span style="vertical-align: 0.000000em; ">a</span>
1315 <span style="vertical-align: 0.000000em; ">", </span>
1316 <span style="vertical-align: 0.000000em; ">"</span>
1317 <span style="vertical-align: 0.000000em; ">foo</span>
1318 <span style="vertical-align: 0.000000em; ">", </span>
1319 <span style="vertical-align: 0.000000em; ">"</span>
1320 <span style="vertical-align: 0.000000em; ">b</span>
1321 <span style="vertical-align: 0.000000em; ">")</span>
1322 </p>
1323 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1324 <p class="Code ">
1325 <span style="vertical-align: 0.000000em; ">a atPut(</span>
1326 <span style="vertical-align: 0.000000em; ">6</span>
1327 <span style="vertical-align: 0.000000em; ">, "Fred")</span>
1328 </p>
1329 <p class="Code ">
1330 <span style="vertical-align: 0.000000em; ">==&gt;</span>
1331 <span style="vertical-align: 0.000000em; "> Exception: index out of bounds</span>
1332 </p>
1333 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1334 <p class="Body " style="vertical-align: 0.000000em; ">Remove an item at a given index:</p>
1335 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1336 <p class="Code " style="vertical-align: 0.000000em; ">a remove(&#x201C;foo&#x201D;)</p>
1337 <p class="Code ">
1338 <span style="vertical-align: 0.000000em; ">==&gt; list(</span>
1339 <span style="vertical-align: 0.000000em; ">33</span>
1340 <span style="vertical-align: 0.000000em; ">, "</span>
1341 <span style="vertical-align: 0.000000em; ">a</span>
1342 <span style="vertical-align: 0.000000em; ">"</span>
1343 <span style="vertical-align: 0.000000em; ">, </span>
1344 <span style="vertical-align: 0.000000em; ">"</span>
1345 <span style="vertical-align: 0.000000em; ">b</span>
1346 <span style="vertical-align: 0.000000em; ">")</span>
1347 </p>
1348 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1349 <p class="Body ">
1350 <span style="vertical-align: 0.000000em; ">Inserting an item at</span>
1351 <span style="vertical-align: 0.000000em; "> a given index</span>
1352 <span style="vertical-align: 0.000000em; ">:</span>
1353 </p>
1354 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1355 <p class="Code ">
1356 <span style="vertical-align: 0.000000em; ">a atPut(2, "</span>
1357 <span style="vertical-align: 0.000000em; ">foo</span>
1358 <span style="vertical-align: 0.000000em; ">")</span>
1359 </p>
1360 <p class="Code ">
1361 <span style="vertical-align: 0.000000em; ">==&gt; list(</span>
1362 <span style="vertical-align: 0.000000em; ">33</span>
1363 <span style="vertical-align: 0.000000em; ">, "</span>
1364 <span style="vertical-align: 0.000000em; ">a</span>
1365 <span style="vertical-align: 0.000000em; ">", </span>
1366 <span style="vertical-align: 0.000000em; ">"</span>
1367 <span style="vertical-align: 0.000000em; ">foo</span>
1368 <span style="vertical-align: 0.000000em; ">", </span>
1369 <span style="vertical-align: 0.000000em; ">"</span>
1370 <span style="vertical-align: 0.000000em; ">56</span>
1371 <span style="vertical-align: 0.000000em; ">")</span>
1372 </p>
1373 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1374 <p class="Heading_2 ">
1375 <span style="vertical-align: 0.000000em; ">foreach</span>
1376 <span style="vertical-align: 0.000000em; "></span>
1377 </p>
1378 <p class="Body " style="vertical-align: 0.000000em; ">The foreach, map and select methods can be used in three forms:</p>
1379 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1380 <p class="Code ">
1381 <span style="vertical-align: 0.000000em; ">Io&gt; </span>
1382 <span style="vertical-align: 0.000000em; ">a</span>
1383 <span style="vertical-align: 0.000000em; "> := list(</span>
1384 <span style="vertical-align: 0.000000em; ">65, 21, 122</span>
1385 <span style="vertical-align: 0.000000em; ">)</span>
1386 </p>
1387 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1388 <p class="Body ">
1389 <span style="vertical-align: 0.000000em; ">In the first form, the first argument i</span>
1390 <span style="vertical-align: 0.000000em; ">s used as an index variable, the second as a value variable and the 3rd as the expression to evaluate for each value.</span>
1391 </p>
1392 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1393 <p class="Code ">
1394 <span style="vertical-align: 0.000000em; ">Io&gt; </span>
1395 <span style="vertical-align: 0.000000em; ">a</span>
1396 <span style="vertical-align: 0.000000em; "> </span>
1397 <span style="vertical-align: 0.000000em; ">foreach</span>
1398 <span style="vertical-align: 0.000000em; ">(i, v, </span>
1399 <span style="vertical-align: 0.000000em; ">write(i, &#x201C;:&#x201D;, v, &#x201C;, &#x201D;)</span>
1400 <span style="vertical-align: 0.000000em; ">)</span>
1401 </p>
1402 <p class="Code ">
1403 <span style="vertical-align: 0.000000em; ">==&gt; </span>
1404 <span style="vertical-align: 0.000000em; ">0:65, 1:21, 2:122,</span>
1405 <span style="vertical-align: 0.000000em; "></span>
1406 </p>
1407 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1408 <p class="Body " style="vertical-align: 0.000000em; ">The second form removes the index argument:</p>
1409 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1410 <p class="Code ">
1411 <span style="vertical-align: 0.000000em; ">Io&gt; </span>
1412 <span style="vertical-align: 0.000000em; ">a</span>
1413 <span style="vertical-align: 0.000000em; "> foreach(v, </span>
1414 <span style="vertical-align: 0.000000em; ">v</span>
1415 <span style="vertical-align: 0.000000em; "> println)</span>
1416 </p>
1417 <p class="Code ">
1418 <span style="vertical-align: 0.000000em; ">==&gt; 65</span>
1419 <span style="vertical-align: 0.000000em; "></span>
1420 </p>
1421 <p class="Code ">
1422 <span style="vertical-align: 0.000000em; ">21</span>
1423 <span style="vertical-align: 0.000000em; "></span>
1424 </p>
1425 <p class="Code ">
1426 <span style="vertical-align: 0.000000em; ">122</span>
1427 <span style="vertical-align: 0.000000em; "></span>
1428 </p>
1429 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1430 <p class="Body " style="vertical-align: 0.000000em; ">The third form removes the value argument and simply sends the expression as a message to each value:</p>
1431 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1432 <p class="Code ">
1433 <span style="vertical-align: 0.000000em; ">Io&gt; </span>
1434 <span style="vertical-align: 0.000000em; ">a</span>
1435 <span style="vertical-align: 0.000000em; "> foreach(</span>
1436 <span style="vertical-align: 0.000000em; ">println</span>
1437 <span style="vertical-align: 0.000000em; ">)</span>
1438 </p>
1439 <p class="Code ">
1440 <span style="vertical-align: 0.000000em; ">==&gt; 65</span>
1441 <span style="vertical-align: 0.000000em; "></span>
1442 </p>
1443 <p class="Code " style="vertical-align: 0.000000em; ">21</p>
1444 <p class="Code ">
1445 <span style="vertical-align: 0.000000em; ">122</span>
1446 <span style="vertical-align: 0.000000em; "></span>
1447 </p>
1448 <p class="Heading_2 " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1449 <p class="Heading_2 " style="vertical-align: 0.000000em; ">map and select</p>
1450 <p class="Body " style="vertical-align: 0.000000em; ">Io's map and select (known as filter in some other languages) methods allow arbitrary expressions as the map/select predicates.</p>
1451 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1452 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; numbers := list(1, 2, 3, 4, 5, 6)</p>
1453 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1454 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; numbers select(isOdd)</p>
1455 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list(1, 3, 5)</p>
1456 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1457 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; numbers select(x, x isOdd)</p>
1458 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list(1, 3, 5)</p>
1459 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1460 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; numbers select(i, x, x isOdd)</p>
1461 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list(1, 3, 5)</p>
1462 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1463 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; numbers map(x, x*2)</p>
1464 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list(2, 4, 6, 8, 10, 12)</p>
1465 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1466 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; numbers map(i, x, x+i)</p>
1467 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list(1, 3, 5, 7, 9, 11)</p>
1468 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1469 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; numbers map(*3)</p>
1470 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list(3, 6, 9, 12, 15, 18)</p>
1471 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1472 <p class="Body ">
1473 <span style="vertical-align: 0.000000em; ">The map and select methods return new lists. To do the same operations in-place, you can use selectInPlace() and mapInPlace() methods.</span>
1474 <span style="vertical-align: 0.000000em; "></span>
1475 </p>
1476 <p class="Heading_1 ">
1477 <a name="TOC26083" style="vertical-align: 0.000000em; " id="TOC26083">Sequence</a>
1478 </p>
1479 <p class="Body ">
1480 <span style="vertical-align: 0.000000em; ">In Io, an immutable Sequence is called a Symbol and a mutable Sequence is the equivalent of a Buffer or String</span>
1481 <span style="vertical-align: 0.000000em; ">. Literal </span>
1482 <span style="vertical-align: 0.000000em; ">strings(ones that appear in source code surrounded by quotes) are Symbols. Mutable operations cannot be performed on Symbols, but one can make mutable copy of a Symbol calling it&#x2019;s asMutable method and then perform the mutation operations on the copy.</span>
1483 <span style="vertical-align: 0.000000em; "></span>
1484 </p>
1485 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Common string operations</p>
1486 <p class="Body " style="vertical-align: 0.000000em; ">Getting the length of a string:</p>
1487 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1488 <p class="Code " style="vertical-align: 0.000000em; ">"abc" size</p>
1489 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 3</p>
1490 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1491 <p class="Body " style="vertical-align: 0.000000em; ">Checking if a string contains a substring:</p>
1492 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1493 <p class="Code " style="vertical-align: 0.000000em; ">"apples" containsSeq("ppl")</p>
1494 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; true</p>
1495 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1496 <p class="Body " style="vertical-align: 0.000000em; ">Getting the character (byte) at position N:</p>
1497 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1498 <p class="Code " style="vertical-align: 0.000000em; ">"Kavi" at(1)</p>
1499 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 97</p>
1500 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1501 <p class="Body " style="vertical-align: 0.000000em; ">Slicing:</p>
1502 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1503 <p class="Code " style="vertical-align: 0.000000em; ">"Kirikuro" slice(0, 2)</p>
1504 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; "Ki"</p>
1505 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1506 <p class="Code " style="vertical-align: 0.000000em; ">"Kirikuro" slice(-2) &#xA0;# NOT: slice(-2, 0)!</p>
1507 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; "ro"</p>
1508 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1509 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; "Kirikuro" slice(0, -2)</p>
1510 <p class="Code " style="vertical-align: 0.000000em; "># "Kiriku"</p>
1511 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1512 <p class="Body " style="vertical-align: 0.000000em; ">Stripping whitespace:</p>
1513 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1514 <p class="Code ">
1515 <span style="vertical-align: 0.000000em; ">" &#xA0;abc &#xA0;" </span>
1516 <span style="vertical-align: 0.000000em; ">adMutable </span>
1517 <span style="vertical-align: 0.000000em; ">strip</span>
1518 </p>
1519 <p class="Code ">
1520 <span style="vertical-align: 0.000000em; ">==&gt;</span>
1521 <span style="vertical-align: 0.000000em; "> "abc"</span>
1522 </p>
1523 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1524 <p class="Code ">
1525 <span style="vertical-align: 0.000000em; ">" &#xA0;abc &#xA0;" asMutable </span>
1526 <span style="vertical-align: 0.000000em; ">l</span>
1527 <span style="vertical-align: 0.000000em; ">strip</span>
1528 </p>
1529 <p class="Code ">
1530 <span style="vertical-align: 0.000000em; ">==&gt;</span>
1531 <span style="vertical-align: 0.000000em; "> "abc</span>
1532 <span style="vertical-align: 0.000000em; "> &#xA0;</span>
1533 <span style="vertical-align: 0.000000em; ">"</span>
1534 </p>
1535 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1536 <p class="Code ">
1537 <span style="vertical-align: 0.000000em; ">"</span>
1538 <span style="vertical-align: 0.000000em; "> &#xA0;</span>
1539 <span style="vertical-align: 0.000000em; ">abc &#xA0;" asMutable rstrip</span>
1540 </p>
1541 <p class="Code ">
1542 <span style="vertical-align: 0.000000em; ">==&gt;</span>
1543 <span style="vertical-align: 0.000000em; "> "</span>
1544 <span style="vertical-align: 0.000000em; "> &#xA0;</span>
1545 <span style="vertical-align: 0.000000em; ">abc"</span>
1546 <span style="vertical-align: 0.000000em; "></span>
1547 </p>
1548 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1549 <p class="Body " style="vertical-align: 0.000000em; ">Converting to upper/lowercase:</p>
1550 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1551 <p class="Code " style="vertical-align: 0.000000em; ">"Kavi" asUppercase</p>
1552 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; "KAVI"</p>
1553 <p class="Code " style="vertical-align: 0.000000em; ">"Kavi" asLowercase</p>
1554 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; "kavi"</p>
1555 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1556 <p class="Body " style="vertical-align: 0.000000em; ">Splitting a string:</p>
1557 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1558 <p class="Code " style="vertical-align: 0.000000em; ">"the quick brown fox" split</p>
1559 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list("the", "quick", "brown", "fox")</p>
1560 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1561 <p class="Body ">
1562 <span style="vertical-align: 0.000000em; ">S</span>
1563 <span style="vertical-align: 0.000000em; ">plitting by others character is possible as well</span>
1564 <span style="vertical-align: 0.000000em; ">.</span>
1565 </p>
1566 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1567 <p class="Code " style="vertical-align: 0.000000em; ">"a few good men" split("e")</p>
1568 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list("a f", "w good m", "n")</p>
1569 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1570 <p class="Body " style="vertical-align: 0.000000em; ">Converting to number:</p>
1571 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1572 <p class="Code " style="vertical-align: 0.000000em; ">"13" asNumber</p>
1573 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 13</p>
1574 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1575 <p class="Code " style="vertical-align: 0.000000em; ">"a13" asNumber</p>
1576 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; nil</p>
1577 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1578 <p class="Body " style="vertical-align: 0.000000em; ">String interpolation:</p>
1579 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1580 <p class="Code " style="vertical-align: 0.000000em; ">name := "Fred"</p>
1581 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; Fred</p>
1582 <p class="Code " style="vertical-align: 0.000000em; ">"My name is #{name}" interpolate</p>
1583 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; My name is Fred</p>
1584 <p class="Body " style="vertical-align: 0.000000em; ">&#xA0;</p>
1585 <p class="Body ">
1586 <span style="vertical-align: 0.000000em; ">I</span>
1587 <span style="vertical-align: 0.000000em; ">nterpolat</span>
1588 <span style="vertical-align: 0.000000em; ">e will eval anything with #{} as Io code in the local context. The code may include loops or anything else but needs to return an object that responds to asString.</span>
1589 </p>
1590 <p class="Heading_1 ">
1591 <a name="TOC27607" style="font-family: 'Helvetica', 'Helvetica'; line-height: 1.21; vertical-align: 0.000000em; " id="TOC27607">Ranges</a>
1592 </p>
1593 <p class="Body ">
1594 <span style="vertical-align: 0.000000em; ">A range is a container containing a start and an end point, and instructions on how to get from the start, to the end. Using Ranges is often convenient when creating large lists of sequential data as they can be easily converted to lists, or as a replacement for the for() method.</span>
1595 <span style="font-family: 'Helvetica', 'Helvetica'; line-height: 1.20; vertical-align: 0.000000em; "></span>
1596 </p>
1597 <p class="Heading_2 ">
1598 <span style="vertical-align: 0.000000em; ">The Range protocol</span>
1599 <span style="font-family: 'Helvetica', 'Helvetica'; line-height: 1.18; vertical-align: 0.000000em; "></span>
1600 </p>
1601 <p class="Body " style="vertical-align: 0.000000em; ">Each object that can be used in Ranges needs to implement a "nextInSequence" method which takes a single optional argument (the number of items to skip in the sequence of objects), and return the next item after that skip value. The default skip value is 1. The skip value of 0 is undefined. An example:</p>
1602 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1603 <p class="Code " style="vertical-align: 0.000000em; ">Number nextInSequence := method(skipVal,</p>
1604 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;if(skipVal isNil, skipVal = 1)</p>
1605 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;self + skipVal</p>
1606 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1607 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1608 <p class="Body " style="vertical-align: 0.000000em; ">With this method on Number (it&#x2019;s already there in the standard libraries), you can then use Numbers in Ranges, as demonstrated below:</p>
1609 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1610 <p class="Code " style="vertical-align: 0.000000em; ">1 to(5) foreach(v, v println)</p>
1611 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1612 <p class="Body " style="vertical-align: 0.000000em; ">The above will print 1 through 5, each on its own line.</p>
1613 <p class="Heading_1 ">
1614 <a name="TOC28533" style="vertical-align: 0.000000em; " id="TOC28533">File</a>
1615 </p>
1616 <p class="Body " style="vertical-align: 0.000000em; ">Tthe methods openForAppending, openForReading, or openForUpdating are used for opening files. To erase an existing file before opening a new open, the remove method can be used. Example:</p>
1617 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1618 <p class="Code " style="vertical-align: 0.000000em; ">f := File with(&#x201C;foo.txt)</p>
1619 <p class="Code " style="vertical-align: 0.000000em; ">f remove</p>
1620 <p class="Code ">
1621 <span style="vertical-align: 0.000000em; ">f </span>
1622 <span style="vertical-align: 0.000000em; ">openForUpdating</span>
1623 </p>
1624 <p class="Code " style="vertical-align: 0.000000em; ">f write(&#x201C;hello world!&#x201D;)</p>
1625 <p class="Code " style="vertical-align: 0.000000em; ">f close</p>
1626 <p class="Heading_1 ">
1627 <a name="TOC28810" style="vertical-align: 0.000000em; " id="TOC28810">Directory</a>
1628 </p>
1629 <p class="Body " style="vertical-align: 0.000000em; ">Creating a directory object:</p>
1630 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1631 <p class="Code ">
1632 <span style="font-size: 9.00pt; vertical-align: 0.000000em; ">dir := Directory with(&#x201C;/Users/steve/&#x201D;)</span>
1633 <span style="vertical-align: 0.000000em; "></span>
1634 </p>
1635 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1636 <p class="Body " style="vertical-align: 0.000000em; ">Get a list of file objects for all the files in a directory:</p>
1637 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1638 <p class="Code " style="vertical-align: 0.000000em; ">files := dir files</p>
1639 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1640 <p class="Code ">
1641 <span style="vertical-align: 0.000000em; ">==&gt; list(File_0x820c40, </span>
1642 <span style="vertical-align: 0.000000em; ">File_0x820c40, ...)</span>
1643 <span style="vertical-align: 0.000000em; "></span>
1644 </p>
1645 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1646 <p class="Body " style="vertical-align: 0.000000em; ">Get a list of both the file and directory objects in a directory:</p>
1647 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1648 <p class="Code " style="vertical-align: 0.000000em; ">items := Directory items</p>
1649 <p class="Code ">
1650 <span style="vertical-align: 0.000000em; ">==&gt; list(Directory_0x8446b0, </span>
1651 <span style="vertical-align: 0.000000em; ">File_0x820c40, ...)</span>
1652 <span style="vertical-align: 0.000000em; "></span>
1653 </p>
1654 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1655 <p class="Code " style="vertical-align: 0.000000em; ">items at(4) name</p>
1656 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; DarkSide-0.0.1 # a directory name</p>
1657 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1658 <p class="Body " style="vertical-align: 0.000000em; ">Setting a Directory object to a certain directory and using it:</p>
1659 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1660 <p class="Code " style="vertical-align: 0.000000em; ">root := Directory clone setPath("c:/")</p>
1661 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; Directory_0x8637b8</p>
1662 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1663 <p class="Code " style="vertical-align: 0.000000em; ">root fileNames</p>
1664 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; list("AUTOEXEC.BAT", "boot.ini", "CONFIG.SYS", ...)</p>
1665 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1666 <p class="Body " style="vertical-align: 0.000000em; ">Testing for existance:</p>
1667 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1668 <p class="Code " style="vertical-align: 0.000000em; ">Directory clone setPath("q:/") exists</p>
1669 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; false</p>
1670 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1671 <p class="Body " style="vertical-align: 0.000000em; ">Getthing the current working directory:</p>
1672 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1673 <p class="Code " style="vertical-align: 0.000000em; ">Directory currentWorkingDirectory</p>
1674 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; &#x201C;/cygdrive/c/lang/IoFull-Cygwin-2006-04-20&#x201D;</p>
1675 <p class="Heading_1 ">
1676 <a name="TOC29611" style="vertical-align: 0.000000em; " id="TOC29611">Date</a>
1677 </p>
1678 <p class="Body " style="vertical-align: 0.000000em; ">Creating a new date instance:</p>
1679 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1680 <p class="Code " style="vertical-align: 0.000000em; ">d := Date clone</p>
1681 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1682 <p class="Body " style="vertical-align: 0.000000em; ">Setting it to the current date/time:</p>
1683 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1684 <p class="Code " style="vertical-align: 0.000000em; ">d now</p>
1685 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1686 <p class="Body " style="vertical-align: 0.000000em; ">Getting the date/time as a number, in seconds:</p>
1687 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1688 <p class="Code " style="vertical-align: 0.000000em; ">Date now asNumber</p>
1689 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 1147198509.417114</p>
1690 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1691 <p class="Code " style="vertical-align: 0.000000em; ">Date now asNumber</p>
1692 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 1147198512.33313</p>
1693 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1694 <p class="Body " style="vertical-align: 0.000000em; ">Getting individual parts of a Date object:</p>
1695 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1696 <p class="Code " style="vertical-align: 0.000000em; ">d := Date now</p>
1697 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 2006-05-09 21:53:03 EST</p>
1698 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1699 <p class="Code " style="vertical-align: 0.000000em; ">d</p>
1700 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 2006-05-09 21:53:03 EST</p>
1701 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1702 <p class="Code " style="vertical-align: 0.000000em; ">d year</p>
1703 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 2006</p>
1704 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1705 <p class="Code " style="vertical-align: 0.000000em; ">d month</p>
1706 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 5</p>
1707 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1708 <p class="Code " style="vertical-align: 0.000000em; ">d day</p>
1709 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 9</p>
1710 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1711 <p class="Code " style="vertical-align: 0.000000em; ">d hour</p>
1712 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 21</p>
1713 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1714 <p class="Code " style="vertical-align: 0.000000em; ">d minute</p>
1715 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 53</p>
1716 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1717 <p class="Code " style="vertical-align: 0.000000em; ">d second</p>
1718 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 3.747125</p>
1719 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1720 <p class="Body " style="vertical-align: 0.000000em; ">Find how long it takes to execute some code:</p>
1721 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1722 <p class="Code " style="vertical-align: 0.000000em; ">Date cpuSecondsToRun(100000 repeat(1+1))</p>
1723 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; 0.02</p>
1724 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1725 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1726 </div>
1727 <div style="margin : 0pt 0pt 0pt 0pt; ">
1728 <p></p>
1729 <p style="padding-top: 0pt; vertical-align: 0.000000em; visibility: hidden; " class="Heading_1 ">&#xA0;</p>
1730 <p class="Heading_1 ">
1731 <a name="TOC30156" style="vertical-align: 0.000000em; " id="TOC30156">Networking</a>
1732 </p>
1733 <p class="Body " style="vertical-align: 0.000000em; ">All of Io&#x2019;s networking is done with asynchronous sockets underneath, but operations like reading and writing to a socket appear to be synchronous since the calling coroutine is unscheduled until the socket has completed the operation, or a timeout occurs. Note that you&#x2019;ll need to first reference the associated addon in order to cause it to load before using it&#x2019;s objects. In these examples, you&#x2019;ll have to reference &#x201C;Socket&#x201D; to get the Socket addon to load first.</p>
1734 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1735 <p class="Body ">
1736 <span style="vertical-align: 0.000000em; ">Creating a </span>
1737 <span style="vertical-align: 0.000000em; ">URL</span>
1738 <span style="vertical-align: 0.000000em; "> object:</span>
1739 </p>
1740 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1741 <p class="Code " style="vertical-align: 0.000000em; ">url := URL with("http://example.com/")</p>
1742 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1743 <p class="Body " style="vertical-align: 0.000000em; ">Fetching an URL:</p>
1744 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1745 <p class="Code " style="vertical-align: 0.000000em; ">data := url fetch &#xA0;</p>
1746 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1747 <p class="Body " style="vertical-align: 0.000000em; ">Streaming a URL to a file:</p>
1748 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1749 <p class="Code ">
1750 <span style="vertical-align: 0.000000em; ">url streamTo(</span>
1751 <span style="vertical-align: 0.000000em; ">File with("out.txt")</span>
1752 <span style="vertical-align: 0.000000em; ">)</span>
1753 </p>
1754 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1755 <p class="Body " style="vertical-align: 0.000000em; ">A simple whois client:</p>
1756 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1757 <p class="Code " style="vertical-align: 0.000000em; ">whois := method(host,</p>
1758 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;socket := Socket clone setHostName("rs.internic.net") setPort(43) </p>
1759 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;socket connect streamWrite(host, "\n")</p>
1760 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;while(socket streamReadNextChunk, nil)</p>
1761 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;return socket readBuffer</p>
1762 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1763 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1764 <p class="Body " style="vertical-align: 0.000000em; ">A minimal web server:</p>
1765 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1766 <p class="Code " style="vertical-align: 0.000000em; ">WebRequest := Object clone do(</p>
1767 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;handleSocket := method(aSocket,</p>
1768 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;aSocket streamReadNextChunk</p>
1769 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;request := aSocket readBuffer betweenSeq("GET ", " HTTP")</p>
1770 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;f := File with(request) </p>
1771 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;if(f exists, f streamTo(aSocket), aSocket streamWrite("not found"))</p>
1772 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;aSocket close</p>
1773 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;)</p>
1774 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1775 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1776 <p class="Code " style="vertical-align: 0.000000em; ">WebServer := Server clone do(</p>
1777 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;setPort(8000)</p>
1778 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;handleSocket := method(aSocket, </p>
1779 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;WebRequest clone @handleSocket(aSocket)</p>
1780 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;)</p>
1781 <p class="Code " style="vertical-align: 0.000000em; ">)</p>
1782 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1783 <p class="Code " style="vertical-align: 0.000000em; ">WebServer start</p>
1784 <p class="Heading_1 ">
1785 <a name="TOC31463" style="vertical-align: 0.000000em; " id="TOC31463">XML</a>
1786 </p>
1787 <p class="Body " style="vertical-align: 0.000000em; ">Using the XML parser to find the links in a web page:</p>
1788 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1789 <p class="Code ">
1790 <span style="font-family: 'Courier', 'Courier'; line-height: 1.22; vertical-align: 0.000000em; ">xml := URL with("http://www.yahoo.com/") fetch </span>
1791 <span style="vertical-align: 0.000000em; ">asXML</span>
1792 </p>
1793 <p class="Code " style="font-family: 'Courier', 'Courier'; line-height: 1.22; vertical-align: 0.000000em; ">links := xml elementsWithName("a") map(attributes at("href"))</p>
1794 <p class="Heading ">
1795 <a name="TOC31637" style="vertical-align: 0.000000em; " id="TOC31637">Unicode</a>
1796 </p>
1797 <p class="Heading_1 ">
1798 <a name="TOC31645" style="vertical-align: 0.000000em; " id="TOC31645">Sequence Encodings</a>
1799 </p>
1800 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1801 <p class="Body " style="vertical-align: 0.000000em; ">In Io, symbols, strings, and vectors are unified into a single Sequence prototype which is an array of any available hardware data type such as:</p>
1802 <p class="Body " style="vertical-align: 0.000000em; ">&#xA0;</p>
1803 <p class="Code " style="vertical-align: 0.000000em; ">uint8, uint16, uint32, uint64</p>
1804 <p class="Code " style="vertical-align: 0.000000em; ">int8, int16, int32, int64</p>
1805 <p class="Code " style="vertical-align: 0.000000em; ">float32, float64</p>
1806 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1807 <p class="Body " style="vertical-align: 0.000000em; ">Also, a Sequence has a encoding attribute, which can be:</p>
1808 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1809 <p class="Code " style="vertical-align: 0.000000em; ">number, ascii, ucs2, ucs4, utf8</p>
1810 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1811 <p class="Body ">
1812 <span style="vertical-align: 0.000000em; ">UCS-2 and </span>
1813 <span style="vertical-align: 0.000000em; ">UCS-4 </span>
1814 <span style="vertical-align: 0.000000em; ">are the fixed character width versions of UTF-16 and UTF-32, respectively. A String is just a Sequence with a text encoding, a Symbol is an immutable String and a Vector is a Sequence with a number encoding.</span>
1815 </p>
1816 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1817 <p class="Body ">
1818 <span style="vertical-align: 0.000000em; ">Except for input and output, all strings should be kept in a fixed character width encoding. </span>
1819 <span style="vertical-align: 0.000000em; ">This design allows for a simpler implementation, code sharing between vector and string ops, fast index-based access, and SIMD acceleration of Sequence operations. </span>
1820 <span style="vertical-align: 0.000000em; ">All Sequence methods will do automatic type conversions as needed.</span>
1821 </p>
1822 <p class="Heading_1 ">
1823 <a name="TOC32526" style="vertical-align: 0.000000em; " id="TOC32526">Source Code</a>
1824 </p>
1825 <p class="Body " style="vertical-align: 0.000000em; ">All Io source files are assumed to be in UTF8 (of which ASCII is a subset). When a source file is read, it s symbols and strings are stored in Sequences in their minimal fixed character width encoding. Examples:</p>
1826 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1827 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1828 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; "hello" encoding</p>
1829 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; ascii</p>
1830 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1831 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; "&#x3C0;" encoding</p>
1832 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; ucs2</p>
1833 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1834 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; "&#x221E;" encoding</p>
1835 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; ucs2</p>
1836 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1837 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1838 <p class="Body " style="vertical-align: 0.000000em; ">We can also inspect the internal representation:</p>
1839 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1840 <p class="Code " style="vertical-align: 0.000000em; ">Io&gt; "&#x3C0;" itemType</p>
1841 <p class="Code " style="vertical-align: 0.000000em; ">==&gt; uint16</p>
1842 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1843 <p class="Code ">
1844 <span style="vertical-align: 0.000000em; ">Io&gt; "</span>
1845 <span style="vertical-align: 0.000000em; ">&#x3C0;</span>
1846 <span style="vertical-align: 0.000000em; ">" itemSize</span>
1847 </p>
1848 <p class="Code ">
1849 <span style="vertical-align: 0.000000em; ">==&gt; 2</span>
1850 <span style="color: #000000; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.20; vertical-align: 0.000000em; "></span>
1851 </p>
1852 <p class="Heading_1 ">
1853 <a name="TOC32941" style="vertical-align: 0.000000em; " id="TOC32941">Conversion</a>
1854 </p>
1855 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1856 <p class="Body " style="vertical-align: 0.000000em; ">The Sequence object has a number of conversion methods:</p>
1857 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1858 <p class="Code " style="vertical-align: 0.000000em; ">asUTF8</p>
1859 <p class="Code " style="vertical-align: 0.000000em; ">asUCS2</p>
1860 <p class="Code " style="vertical-align: 0.000000em; ">asUCS4</p>
1861 <p class="Heading ">
1862 <a name="TOC33031" style="vertical-align: 0.000000em; " id="TOC33031">Embedding</a>
1863 </p>
1864 <p class="Heading_1 ">
1865 <a name="TOC33041" style="vertical-align: 0.000000em; " id="TOC33041">Coding Conventions</a>
1866 </p>
1867 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Io&#x2019;s C code is written using object oriented style conventions where structures are treated as objects and functions as methods. Familiarity with these may help make the embedding APIs easier to understand.</p>
1868 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Structures</p>
1869 <p class="Body " style="vertical-align: 0.000000em; ">Member names are words that begin with a lower case character with successive words each having their first character upper cased. Acronyms are capitalized. Structure names are words with their first character capitalized.</p>
1870 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1871 <p class="Body " style="vertical-align: 0.000000em; ">Example:</p>
1872 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1873 <p class="Code " style="vertical-align: 0.000000em; ">typdef struct </p>
1874 <p class="Code " style="vertical-align: 0.000000em; ">{</p>
1875 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;char *firstName;</p>
1876 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;char *lastName;</p>
1877 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;char *address;</p>
1878 <p class="Code " style="vertical-align: 0.000000em; ">} Person;</p>
1879 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Functions</p>
1880 <p class="Body " style="vertical-align: 0.000000em; ">Function names begin with the name of structure they operate on followed by an underscore and the method name. Each structure has a new and free function.</p>
1881 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1882 <p class="Body " style="vertical-align: 0.000000em; ">Example:</p>
1883 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1884 <p class="Code " style="vertical-align: 0.000000em; ">List *List_new(void);</p>
1885 <p class="Code " style="vertical-align: 0.000000em; ">void List_free(List *self);</p>
1886 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1887 <p class="Body " style="vertical-align: 0.000000em; ">All methods (except new) have the structure (the "object") as the first argument the variable is named "self". Method names are in keyword format. That is, for each argument, the method name has a description followed by an underscore. The casing of the descriptions follow that of structure member names.</p>
1888 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1889 <p class="Body " style="vertical-align: 0.000000em; ">Examples:</p>
1890 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1891 <p class="Code " style="vertical-align: 0.000000em; ">int List_count(List *self); /* no argument */</p>
1892 <p class="Code " style="vertical-align: 0.000000em; ">void List_add_(List *self, void *item); /* one argument */</p>
1893 <p class="Code " style="vertical-align: 0.000000em; ">void Dictionary_key_value_(Dictionary *self, char *key, char *value); </p>
1894 <p class="Heading_2 " style="vertical-align: 0.000000em; ">File Names</p>
1895 <p class="Body " style="vertical-align: 0.000000em; ">Each structure has it's own separate .h and .c files. The names of the files are the same as the name of the structure. These files contain all the functions(methods) that operate on the given structure.</p>
1896 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1897 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1898 </div>
1899 <div style="margin : 0pt 0pt 0pt 0pt; ">
1900 <p></p>
1901 <p style="padding-top: 0pt; vertical-align: 0.000000em; visibility: hidden; " class="Heading_1 ">&#xA0;</p>
1902 <p class="Heading_1 ">
1903 <a name="TOC34530" style="vertical-align: 0.000000em; " id="TOC34530">IoState</a>
1904 </p>
1905 <p class="Body " style="vertical-align: 0.000000em; ">An IoState can be thought of as an instance of an Io &#x201C;virtual machine&#x201D;, although &#x201C;virtual machine&#x201D; is a less appropriate term because it implies a particular type of implementation. </p>
1906 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Multiple states</p>
1907 <p class="Body " style="vertical-align: 0.000000em; ">Io is multi-state, meaning that it is designed to support multiple state instances within the same process. These instances are isolated and share no memory so they can be safely accessed simultaneously by different os threads, though a given state should only be accessed by one os thread at a time.</p>
1908 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Creating a state</p>
1909 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">Here&#x2019;s a simple example of creating a state, evaluating a string in it, and freeing the state:</p>
1910 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1911 <p class="Code " style="vertical-align: 0.000000em; ">#include "IoState.h"</p>
1912 <p class="Code " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1913 <p class="Code " style="vertical-align: 0.000000em; ">int main(int argc, const char *argv[])</p>
1914 <p class="Code " style="vertical-align: 0.000000em; ">{</p>
1915 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;IoState *self = IoState_new();</p>
1916 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;IoState_init(self);</p>
1917 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;IoState_doCString_(self, &#x201C;writeln(\&#x201D;hello world!\&#x201D;&#x201D;);</p>
1918 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;IoState_free(self);</p>
1919 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;return 0;</p>
1920 <p class="Code " style="vertical-align: 0.000000em; ">}</p>
1921 <p class="Heading_1 ">
1922 <a name="TOC35356" style="vertical-align: 0.000000em; " id="TOC35356">Values</a>
1923 </p>
1924 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">We can also get return values and look at their types and print them:</p>
1925 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1926 <p class="Code " style="vertical-align: 0.000000em; ">IoObject *v = IoState_doCString_(self, someString);</p>
1927 <p class="Code " style="vertical-align: 0.000000em; ">char *name = IoObject_name(v);</p>
1928 <p class="Code " style="vertical-align: 0.000000em; ">printf(&#x201C;return type is a &#x2018;%s&#x2019;, name);</p>
1929 <p class="Code " style="vertical-align: 0.000000em; ">IoObject_print(v);</p>
1930 <p class="Heading_2 " style="vertical-align: 0.000000em; ">Checking value types</p>
1931 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; " class="Body ">There are some macro short cuts to help with quick type checks:</p>
1932 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
1933 <p class="Code " style="vertical-align: 0.000000em; ">if (ISNUMBER(v))</p>
1934 <p class="Code " style="vertical-align: 0.000000em; ">{</p>
1935 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;printf(&#x201C;result is the number %f&#x201D;, IoNumber_asFloat(v));</p>
1936 <p class="Code " style="vertical-align: 0.000000em; ">} </p>
1937 <p class="Code " style="vertical-align: 0.000000em; ">else if(ISSEQ(v))</p>
1938 <p class="Code " style="vertical-align: 0.000000em; ">{</p>
1939 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;printf(&#x201C;result is the string %s&#x201D;, IoSeq_asCString(v));</p>
1940 <p class="Code " style="vertical-align: 0.000000em; ">}</p>
1941 <p class="Code " style="vertical-align: 0.000000em; ">else if(ISLIST(v))</p>
1942 <p class="Code " style="vertical-align: 0.000000em; ">{</p>
1943 <p class="Code " style="vertical-align: 0.000000em; ">&#xA0;&#xA0;&#xA0;&#xA0;printf(&#x201C;result is a list with %i elements&#x201D;, IoList_rawSize(v));</p>
1944 <p class="Code " style="vertical-align: 0.000000em; ">}</p>
1945 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1946 <p class="Body " style="vertical-align: 0.000000em; ">Note that return values are always proper Io objects (as all values are objects in Io). You can find the C level methods (functions like IoList_rawSize()) for these objects in the header files in the folder Io/libs/iovm/source. </p>
1947 <p class="Heading_1 " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1948 <p class="Heading_1 ">
1949 <a name="TOC36136" style="vertical-align: 0.000000em; " id="TOC36136">Bindings</a>
1950 </p>
1951 <p class="Body " style="vertical-align: 0.000000em; ">forthcoming..</p>
1952 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
1953 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 3.000000pt; " class="Heading "></p>
1954 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 3.000000pt; " class="Heading ">
1955 <a name="TOC36161" id="TOC36161">Appendix</a>
1956 </p>
1957 <p class="Heading_1 ">
1958 <a name="TOC36170" id="TOC36170">
1959 <span style="vertical-align: 0.000000em; ">Grammar</span>
1960 <span style="font-size: 8.00pt; vertical-align: 0.000000em; "></span>
1961 </a>
1962 </p>
1963 <p class="Heading_2 " style="vertical-align: 0.000000em; ">messages</p>
1964 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">expression ::= { message | sctpad }</p>
1965 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">message ::= [wcpad] symbol [scpad] [arguments]</p>
1966 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">arguments ::= Open [argument [ { Comma argument } ]] Close</p>
1967 <p class="Code ">
1968 <span style="font-size: 10.00pt; vertical-align: 0.000000em; ">argument ::= [wcpad] expression [wcpad]</span>
1969 <span style="font-family: 'ArialMT', 'Arial'; font-size: 10.00pt; line-height: 1.10; vertical-align: 0.000000em; "></span>
1970 </p>
1971 <p class="Heading_2 " style="vertical-align: 0.000000em; ">symbols</p>
1972 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">symbol ::= Identifier | number | Operator | quote</p>
1973 <p class="Code " style="vertical-align: 0.000000em; ">Identifier ::= { letter | digit | "_" }</p>
1974 <p class="Code " style="vertical-align: 0.000000em; ">Operator ::= { &#x201C;:&#x201D; | "." | "'" | "~" | "!" | "@" | "$" | "%" | "^" | "&amp;" | "*" | "-" | "+" | "/" | "=" | "{" | "}" | "[" | "]" | "|" | "\" | "&lt;" | "&gt;" | "?" }</p>
1975 <p class="Heading_2 " style="vertical-align: 0.000000em; ">quotes</p>
1976 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">quote ::= MonoQuote | TriQuote</p>
1977 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">MonoQuote ::= """ [ "\"" | not(""")] """</p>
1978 <p class="Code ">
1979 <span style="font-size: 10.00pt; vertical-align: 0.000000em; ">TriQuote ::= """"" [ not(""""")] """""</span>
1980 <span style="font-family: 'ArialMT', 'Arial'; font-size: 10.00pt; line-height: 1.10; vertical-align: 0.000000em; "></span>
1981 </p>
1982 <p class="Heading_2 " style="vertical-align: 0.000000em; ">spans</p>
1983 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">Terminator ::= { [seperator] ";" | "\n" | "\r" [seperator] }</p>
1984 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">seperator ::= { " " | "\f" | "\t" | "\v" }</p>
1985 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">whitespace ::= { " " | "\f" | "\r" | "\t" | "\v" | "\n" }</p>
1986 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">sctpad ::= { separator | Comment | Terminator }</p>
1987 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">scpad ::= { separator | Comment }</p>
1988 <p class="Code ">
1989 <span style="font-size: 10.00pt; vertical-align: 0.000000em; ">wcpad ::= { whitespace | Comment }</span>
1990 <span style="font-family: 'ArialMT', 'Arial'; font-size: 10.00pt; line-height: 1.10; vertical-align: 0.000000em; "></span>
1991 </p>
1992 <p class="Heading_2 " style="vertical-align: 0.000000em; ">comments</p>
1993 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">Comment ::= slashStarComment | slashSlashComment | poundComment</p>
1994 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">slashStarComment ::= "/*" [not("*/")] "*/"</p>
1995 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">slashSlashComment ::= "//" [not("\n")] "\n"</p>
1996 <p class="Code ">
1997 <span style="font-size: 10.00pt; vertical-align: 0.000000em; ">poundComment ::= "#" [not("\n")] "\n"</span>
1998 <span style="font-family: 'ArialMT', 'Arial'; font-size: 10.00pt; line-height: 1.10; vertical-align: 0.000000em; "></span>
1999 </p>
2000 <p class="Heading_2 " style="vertical-align: 0.000000em; ">numbers</p>
2001 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">number ::= HexNumber | Decimal</p>
2002 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">HexNumber ::= "0" anyCase("x") { [ digit | hexLetter ] }</p>
2003 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">hexLetter ::= "a" | "b" | "c" | "d" | "e" | "f"</p>
2004 <p class="Code ">
2005 <span style="font-size: 10.00pt; vertical-align: 0.000000em; ">Decimal ::= digits | "." digits | digits "." digits ["e" [-] digits]</span>
2006 <span style="font-family: 'ArialMT', 'Arial'; font-size: 10.00pt; line-height: 1.10; vertical-align: 0.000000em; "></span>
2007 </p>
2008 <p class="Heading_2 " style="vertical-align: 0.000000em; ">characters</p>
2009 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">Comma ::= ","</p>
2010 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">Open ::= "(" | "[" | "{"</p>
2011 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">Close ::= ")" | "]" | "}"</p>
2012 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">letter ::= "a" ... "z" | "A" ... "Z"</p>
2013 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">digit ::= "0" ... "9"</p>
2014 <p class="Code " style="font-size: 10.00pt; vertical-align: 0.000000em; ">digits ::= { digit }</p>
2015 <p class="Body " style="font-family: 'ArialMT', 'Arial'; line-height: 1.10; vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
2016 <p class="Body "></p>
2017 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
2018 <p class="Heading ">
2019 <a name="TOC37599" style="vertical-align: 0.000000em; " id="TOC37599">Credits</a>
2020 </p>
2021 <p class="Body " style="vertical-align: 0.000000em; ">Io is the product of all the talented folks who taken the time and interest to make a contribution. The complete list of contributors is difficult to keep track of, but some of the recent major contributors include; Jonathan Wright, Jeremy Tregunna, Mike Austin, Chris Double, Oliver Ansaldi, Baptist Heyman, Ken Kerahone, Christian Thater, Brian Mitchell, Zachary Bir and many more. The mailing list archives, repo inventory and release history are probably the best sources for a more complete record of individual contributions.</p>
2022 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
2023 <p class="Heading ">
2024 <a name="TOC38140" style="vertical-align: 0.000000em; " id="TOC38140">References</a>
2025 </p>
2026 <p style="margin-bottom: 0.000000pt; margin-left: 72.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; visibility: hidden; " class="Body ">&#xA0;</p>
2027 <div class="Body ">
2028 <table cellspacing="0" style="background-color: transparent; border-collapse: collapse; " class="Table">
2029 <tr>
2030 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 286pt; vertical-align: top; width: 17pt; " class="Normal table_cell_style_default">
2031 <div>
2032 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-top: 0pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; " class="Body ">1</p>
2033 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2034 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2035 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2036 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; " class="Body ">2</p>
2037 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2038 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2039 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2040 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; " class="Body ">3</p>
2041 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2042 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2043 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2044 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; " class="Body ">4</p>
2045 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2046 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2047 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2048 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; " class="Body ">5</p>
2049 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2050 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2051 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; visibility: hidden; " class="Body ">&#xA0;</p>
2052 <p style="margin-bottom: 0.000000pt; margin-left: 0.00pt; margin-top: 0.000000pt; padding-bottom: 0pt; text-indent: 0.00pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; font-style: normal; font-weight: normal; line-height: 1.20; " class="Body ">6</p>
2053 </div>
2054 </td>
2055 <td style="background-color: transparent; border: 1.00pt #bfbfbf none; height: 286pt; vertical-align: top; width: 358pt; " class="Normal table_cell_style_default">
2056 <div>
2057 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; padding-top: 0pt; " class="Footnote_Text ">Goldberg, A et al. </p>
2058 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Smalltalk-80: The Language and Its Implementation</p>
2059 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Addison-Wesley, 1983</p>
2060 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; visibility: hidden; " class="Footnote_Text ">&#xA0;</p>
2061 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Ungar, D and Smith, </p>
2062 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">RB. Self: The Power of Simplicity</p>
2063 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">OOPSLA, 1987</p>
2064 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; visibility: hidden; " class="Footnote_Text ">&#xA0;</p>
2065 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Smith, W. </p>
2066 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Class-based NewtonScript Programming</p>
2067 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">PIE Developers magazine, Jan 1994</p>
2068 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; visibility: hidden; " class="Footnote_Text ">&#xA0;</p>
2069 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Lieberman</p>
2070 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">H. Concurrent Object-Oriented Programming in Act 1</p>
2071 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">MIT AI Lab, 1987</p>
2072 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; visibility: hidden; " class="Footnote_Text ">&#xA0;</p>
2073 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">McCarthy, J et al. </p>
2074 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">LISP I programmer's manual</p>
2075 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">MIT Press, 1960</p>
2076 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; visibility: hidden; " class="Footnote_Text ">&#xA0;</p>
2077 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Ierusalimschy, R, et al. &#xA0;&#xA0;&#xA0;&#xA0;</p>
2078 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0.000000pt; " class="Footnote_Text ">Lua: an extensible extension language</p>
2079 <p style="margin-bottom: 0.000000pt; margin-top: 0.000000pt; padding-bottom: 0pt; " class="Footnote_Text ">John Wiley &amp; Sons, 1996</p>
2080 </div>
2081 </td>
2082 </tr>
2083 </table>
2084 <span style="vertical-align: 0.000000em; "></span>
2085 </div>
2086 <p class="Body " style="vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
2087 <p class="Heading "></p>
2088 <p class="Heading ">
2089 <a name="TOC38156" id="TOC38156">
2090 <span style="vertical-align: 0.000000em; ">License</span>
2091 <span style="vertical-align: 0.000000em; "></span>
2092 </a>
2093 </p>
2094 <p class="Body " style="font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.20; vertical-align: 0.000000em; ">Copyright 2006 Steve Dekorte. All rights reserved.</p>
2095 <p class="Body " style="font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.20; vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
2096 <p class="Body " style="font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.20; vertical-align: 0.000000em; ">Redistribution and use of this document with or without modification, are permitted provided that the copies reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</p>
2097 <p class="Body " style="font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.20; vertical-align: 0.000000em; visibility: hidden; ">&#xA0;</p>
2098 <p style="padding-bottom: 0pt; font-family: 'Helvetica', 'Helvetica'; font-size: 10.00pt; line-height: 1.20; vertical-align: 0.000000em; " class="Body ">This documentation is provided "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the Io documentation project be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this documentation, even if advised of the possibility of such damage.</p>
2099 </div>
2100 </body>
2101 </html>