root/docs/nowelium/ioDocs/IoGuide_ja.html

Revision 20078, 61.6 kB (checked in by drry, 6 years ago)
  • fixed, added and removed subversion props.
  • Property svn:mime-type set to text/html
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
5<title>Io プログラミングガイド</title>
6<META HTTP-EQUIV="EXPIRES" CONTENT=0>
7<link rel="stylesheet" href="docs.css">
8</head>
9<body>
10
11<h1>Io プログラミングガイド</h1>
12<p>
13<br>
14
15<table style="width:47em">
16<tr>
17<td valign=top style="width:33%">
18
19<div class=indexSection><a href="#Introduction">概要</a></div>
20<div class=indexItem><a href="#Introduction-Perspective">観点</a></div>
21<div class=indexItem><a href="#Introduction-Getting-Started">はじめましょう</a></div>
22<div class=indexItem><a href="#Introduction-Downloading">ダウンロード</a></div>
23<div class=indexItem><a href="#Introduction-Installing">インストール</a></div>
24<div class=indexItem><a href="#Introduction-Binaries">バイナリ</a></div>
25<div class=indexItem><a href="#Introduction-Running-Scripts">スクリプトの実行</a></div>
26<div class=indexItem><a href="#Introduction-Interactive-Mode">対話モード</a></div>
27
28<div class=indexSection><a href="#Syntax">構文</a></div>
29<div class=indexItem><a href="#Syntax-Expressions">式</a></div>
30<div class=indexItem><a href="#Syntax-Messages">メッセージ</a></div>
31<div class=indexItem><a href="#Syntax-Operators">演算子</a></div>
32<div class=indexItem><a href="#Syntax-Assignment">代入</a></div>
33<div class=indexItem><a href="#Syntax-Numbers">数値</a></div>
34<div class=indexItem><a href="#Syntax-Strings">文字列</a></div>
35<div class=indexItem><a href="#Syntax-Comments">コメント</a></div>
36
37
38<div class=indexSection><a href="#Objects">オブジェクト</a></div>
39<div class=indexItem><a href="#Objects-Overview">概略</a></div>
40<div class=indexItem><a href="#Objects-Prototypes">プロトタイプ</a></div>
41<div class=indexItem><a href="#Objects-Inheritance">継承</a></div>
42<div class=indexItem><a href="#Objects-Methods">メソッド</a></div>
43<div class=indexItem><a href="#Objects-Blocks">ブロック</a></div>
44<div class=indexItem><a href="#Objects-Forward">転送</a></div>
45<div class=indexItem><a href="#Objects-Resend">再送</a></div>
46<div class=indexItem><a href="#Objects-Super">スーパー</a></div>
47<div class=indexItem><a href="#Objects-Introspection">イントロスペクション</a></div>
48
49
50</td>
51<td valign=top style="width:33%">
52
53<div class=indexSection><a href="#Control-Flow">コントロール・フロー</a></div>
54<div class=indexItem><a href="#Control-Flow-true-false-and-nil">true, false と nil</a></div>
55<div class=indexItem><a href="#Control-Flow-Comparison">比較</a></div>
56<div class=indexItem><a href="#Control-Flow-Conditions">条件分岐</a></div>
57<div class=indexItem><a href="#Control-Flow-Loops">ループ</a></div>
58
59
60<div class=indexSection><a href="#Importing">インポート</a></div>
61
62<div class=indexSection><a href="#Concurrency">並行動作</a></div>
63<div class=indexItem><a href="#Concurrency-Coroutines">コルーチン</a></div>
64<div class=indexItem><a href="#Concurrency-Scheduler">スケジューラ</a></div>
65<div class=indexItem><a href="#Concurrency-Actors">アクタ</a></div>
66<div class=indexItem><a href="#Concurrency-Futures">Future</a></div>
67<div class=indexItem><a href="#Concurrency-Yield">Yield</a></div>
68<div class=indexItem><a href="#Concurrency-Pause-and-Resume">一時停止と再開</a></div>
69
70<div class=indexSection><a href="#Exceptions">例外</a></div>
71<div class=indexItem><a href="#Exceptions-Raise">例外の発生</a></div>
72<div class=indexItem><a href="#ExceptionsTry-and-Catch">Try と Catch</a></div>
73<div class=indexItem><a href="#Exceptions-Pass">パス</a></div>
74<div class=indexItem><a href="#Exceptions-Custom-Exceptions">カスタム例外</a></div>
75
76<div class=indexSection><a href="#Unicode">Unicode</a></div>
77<div class=indexItem><a href="#Unicode-Sequences">Sequences</a></div>
78<div class=indexItem><a href="#Unicode-Source">Source</a></div>
79<div class=indexItem><a href="#Unicode-Conversion">変換</a></div>
80
81</td>
82<td valign=top style="width:33%">
83
84<div class=indexSection><a href="#Primitives">プリミティブ</a></div>
85<div class=indexItem><a href="#Primitives-Object">オブジェクト</a></div>
86<div class=indexItem><a href="#Primitives-List">リスト</a></div>
87<div class=indexItem><a href="#Primitives-Sequence">シーケンス</a></div>
88<div class=indexItem><a href="#Primitives-Ranges">範囲</a></div>
89<div class=indexItem><a href="#Primitives-File">ファイル</a></div>
90<div class=indexItem><a href="#Primitives-Directory">ディレクトリ</a></div>
91<div class=indexItem><a href="#Primitives-Date">日付</a></div>
92<div class=indexItem><a href="#Primitives-Networking">ネットワーク</a></div>
93<div class=indexItem><a href="#Primitives-XML">XML</a></div>
94<div class=indexItem><a href="#Primitives-Vector">ベクトル</a></div>
95
96<div class=indexSection><a href="#Embedding">組み込み</a></div>
97<div class=indexItem><a href="#Embedding-Conventions">Conventions</a></div>
98<div class=indexItem><a href="#Embedding-IoState">IoState</a></div>
99<div class=indexItem><a href="#Embedding-Values">Values</a></div>
100
101<div class=indexSection><a href="#Bindings">バインディング</a></div>
102
103<div class=indexSection><a href="#Appendix">付録</a></div>
104<div class=indexItem><a href="#Appendix-Grammar">文法</a></div>
105<div class=indexItem><a href="#Appendix-Credits">協力者</a></div>
106<div class=indexItem><a href="#Appendix-References">参考</a></div>
107<div class=indexItem><a href="#Appendix-License">ライセンス</a></div>
108
109</td>
110</tr>
111</table>
112
113<p>
114
115<h2>概要<a name="Introduction"></a></h2>
116<div class=indent>
117
118<div class=quote>
119簡易性は幸福の本質である。<br>
120- Cedric Bledsoe
121</div>
122
123<blockquote class="quote">
124Simplicity is the essence of happiness.<br>
125- Cedric Bledsoe
126</blockquote>
127
128Io はプロトタイプベースの動的言語である。 その着想の大半は Smalltalk (全てがオブジェクトである)、Self[2] (プロトタイプベース), NewtonScript[3] (差分継承), Act1 (アクタとFutureによる並行動作)、Lisp[5] (コードは 検査 / 修正 可能なランタイムツリー) そして Lua[6] (小さい、組み込み可能).
129
130<a name="Introduction-Perspective"></a>
131<h3>観点</h3>
132
133
134<h4>なぜ別の言語か?</h4>
135
136ここ 30 年のプログラミング言語の研究の焦点はほとんど、Smalltalk のような高水準言語の表現力と、Cのような低級言語の性能を融合することにか注意を払うことばかりに進んできました。 その結果、一連の言語はCほど速くないかSmalltalkほど表現力豊かでないものでした。 Io の目的は、動的プログラミングのよる高いレベルでの探査によって、より大きいレベルでのランタイムの柔軟性、および、単純化されたプログラミングの文法と意味による、表現の豊さに再び焦点を当てることでです。
137
138<p>
139
140Io は 全ての値はオブジェクト (継承されたメソッド、スロットを含んでいる場合でも、 何でもランタイムに変更可能)、 全てのコードは式 (それはランタイムに操作、変更可能) であり、 全ての式は動的なメッセージを送信 (代入と制御構造を含む)することで成り立っています。 実行コンテキストは、オブジェクトの集まりとメソッド / ブロックによる活性可能なオブジェクト、そしてブロックによる代入可能なスコープに統一された関数だけです。 並行処理は、アクターとスケーラビリティの為にコルーチンを通して、より簡単に操作しやすく作られています。
141
142<h4>目標</h4>
143
144言語であるために:
145<p>
146
147シンプル
148<ul>
149<li>概念的にシンプルかつ整合的
150<li>簡単な組み込みと拡張
151</ul>
152パワフル
153<ul>
154<li>高度なダイナミック性と イントロスペクト(内部構造の検索)
155<li>高度な並行操作(コルーチンおよび非同期 I/O による)
156</ul>
157実用的
158<ul>
159<li>十分に速い
160<li>マルチプラットフォーム
161<li>非限定的(unrestrictive)な BSD/MIT ライセンス
162<li>広範囲なディストリビューションに渡る標準的なパッケージ
163</ul>
164
165</div>
166
167<h2>はじめましょう<a name="Introduction-Getting-Started"></a></h2>
168<div class=indent> 
169
170<a name="Introduction-Downloading"></a>
171<h3>ダウンロード</h3>
172
173Io の配布は以下から取得できます:
174<pre>
175<a href="http://iolanguage.com">http://iolanguage.com</a>
176</pre>
177
178<a name="Introduction-Installing"></a>
179<h3>インストール</h3>
180
181<h4>VM</h4>
182
183最初に Io vm をコンパイルします:
184
185<pre>
186make vm
187sudo make install
188</pre>
189
190
191<h4>アドオンが依存するライブラリのインストール</h4>
192
193いくつかの Io のアドオンは既にあなたのシステム上にインストールされているライブラリを必用とするかもしれません。 それらを自動的にインストールするのは次をタイプしてください:
194
195<pre>
196su -c "sudo make aptget"
197</pre>
198
199または:
200
201<pre>
202su -c "make emerge"
203</pre>
204
205または:
206
207<pre>
208sudo make port
209</pre>
210
211あなたの使用しているパッケージインストーラによって使い分けでください。
212(<a href="http://macports.org">port</a> is for OSX)
213
214<h4>アドオンのコンパイル</h4>
215
216ビルドをするには、トップディレクトリで以下を実行:
217
218<pre>
219make
220</pre>
221
222バイナリはサブフォルダ _build/binaries に置かれるでしょう。 インストールするには:
223
224<pre>
225sudo make install
226</pre>
227
228もしくは、インストールを、単にあなたの開発用フォルダにリンクするようにするには:
229
230<pre>
231sudo make linkInstall
232</pre>
233
234そしてすべてのユニットテストを実行するには:
235
236<pre>
237make test
238</pre>
239
240いくつかのアドオンがビルドできなくても、そのアドオンがあなたが特別必用としていないなら、それは心配しなくても大丈夫です。 アドオンは任意のライブラリです。
241
242<h4>ノート</h4>
243
244特定のアドオンのみ make するには、以下のようにしてください:
245
246<pre>
247make AddonName
248</pre>
249
250ソースコントロール上のリポジトリから取得してきた後は、必ずしてください:
251
252<pre>
253make clean; make
254</pre>
255
256VM のテストのみ実行:
257
258<pre>
259make testvm
260</pre>
261
262<a name="Introduction-Binaries"></a>
263<h4>バイナリ</h4>
264
265Io は2つの実行可能形式をビルドし、binaries フォルダに配置します。 それらは以下:
266
267<pre>
268io_static
269io
270</pre>
271
272io_static は最小量のセットの基本関数が静的にすべてリンクされている vm を含んでいる実行可能な形式です。 io は実行時に、iovm が動的にリンクされたライブラリをロードすることができます。それは、io のアドオンが参照されたときに動的に組み込まれます。
273
274
275<a name="Introduction-Running-Scripts"></a>
276<h3>スクリプトの実行</h3>
277
278スクリプトを実行する例:
279
280<pre>
281io samples/HelloWorld.io
282</pre>
283
284Io が最初に実行するものに、どんな main() 関数やオブジェクトも必要ありません。 スクリプトはコンパイルされると実行されます。
285
286<a name="Introduction-Interactive-Mode"></a>
287<h3>対話モード</h3>
288
289実行:
290
291<pre>
292./_build/binaries/io
293</pre>
294
295もし Io がインストール済みなら、以下のように実行:
296
297<pre>
298io
299</pre>
300
301Io のインタプリタのプロンプトが引かれるでしょう。
302<p>
303直接入力する事で、コードを評価することができます。 例:
304
305<pre>
306Io> "Hello world!" println
307==> Hello world!
308</pre>
309
310式は Lobby のコンテキストにて評価される :
311
312<pre>
313Io> print
314[lobby のコンテンツが出力される]
315</pre>
316
317あなたのホームフォルダに .iorc が存在する場合、対話モードのプロンプトが開始される前にそれが評価されます。
318
319
320<h4>オブジェクトのインスペクト</h4>
321
322このようにしてオブジェクトのスロットのリストを取得することができます:
323
324<pre>
325Io> someObject slotNames
326</pre>
327
328それらをソート順にするには:
329
330<pre>
331Io> someObject slotNames sort
332</pre>
333
334オブジェクトの記述がうまくフォーマットされた形式においては slotSummary メソッドが便利です:
335
336<pre>
337Io> slotSummary
338==>  Object_0x20c4e0:
339  Lobby            = Object_0x20c4e0
340  Protos           = Object_0x20bff0
341  exit             = method(...)
342  forward          = method(...)
343</pre>
344
345Exploring further:
346
347<pre>
348Io> Protos
349==>  Object_0x20bff0:
350  Addons           = Object_0x20c6f0
351  Core             = Object_0x20c4b0
352
353Io> Protos Addons
354==>  Object_0x20c6f0:
355  ReadLine         = Object_0x366a10
356</pre>
357
358他の Addons が組み込まれていないので、RadLine だけが Addons に表示されています。
359<p>
360メソッドをインスペクトすると、その時のバージョンで逆コンパイルされたものが表示されるでしょう:
361
362<pre>
363Io> Lobby getSlot("forward")
364==> # io/Z_Importer.io:65
365method(
366    Importer import(call)
367)
368</pre>
369
370<h4>doFile と doString</h4>
371
372対話モードにて doFile メソッドを使用すると、スクリプトを実行することができる:
373
374<pre>
375doFile("scriptName.io")
376</pre>
377
378doFile はレシーバのコンテキストにて評価します。(この場合レシーバは lobby でしょう)。 他のオブジェクトのコンテキストにてスクリプトを評価するには、 doFile メッセージをそれに送信します:
379
380<pre>
381someObject doFile("scriptName.io")
382</pre>
383
384文字列を評価するには doString メソッドを使用することができます:
385
386<pre>
387Io> doString("1+1")
388==> 2
389</pre>
390
391また、特定のオブジェクトのコンテキストで文字列を評価するには:
392
393<pre>
394someObject doString("1 + 1")
395</pre>
396
397<h4>コマンドライン引数</h4>
398
399コマンドライン引数を出力する例:
400
401<pre>
402args foreach(k, v, write("'", v, "'\n"))
403</pre>
404
405<h4>launchPath</h4>
406
407System の &quot;launchPath&quot; スロットには、実行された最初のソースファイルの位置が格納されている。
408
409</div>
410<h2>構文<a name="Syntax"></a></h2>
411<div class=indent>
412
413<div class=quote>
414より少ないことは、より豊かなこと<br>
415- Ludwig Mies van der Rohe
416</div>
417
418<div class=quote>
419Less is more.<br>
420- Ludwig Mies van der Rohe
421</div>
422
423<a name="Syntax-Expressions"></a>
424<h3>式</h3>
425
426Io キーワードや文を持たない。 すべてが完全なメッセージで構成された式であり、そのそれぞれがランタイムにアクセス可能なオブジェクトである。 非公式の BNF 記述:
427
428<pre>
429exp        ::= { message | terminator }
430message    ::= symbol [arguments]
431arguments  ::= "(" [exp [ { "," exp } ]] ")"
432symbol     ::= identifier | number | string
433terminator ::= "\n" | ";"
434</pre>
435
436For performance reasons, String and Number literal messages have their results cached in their message objects.
437
438<a name="Syntax-Messages"></a>
439<h3>メッセージ</h3>
440
441メッセージ引数はレシーバに式として渡され評価される。 引数の評価の選択は制御構造を実装するために使用できる 例:
442
443<pre>
444for(i, 1, 10, i println)
445a := if(b == 0, c + 1, d)
446</pre>
447
448上記コードでの、&quot;for&quot; と &quot;if&quot; は通常のメッセージであり、特殊形式やキーワードでは無い。
449<p>
450
451Likewise, dynamic evaluation can be used with enumeration without the need to wrap the expression in a block. 例:
452
453<pre>
454people select(person, person age < 30)
455names := people map(person, person name)
456</pre>
457
458Methods like map and select will typically apply the expression directly to the values if only the expression is provided:
459
460<pre>
461people select(age < 30)
462names := people map(name)
463</pre>
464
465There 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:
466
467<pre>
468Account := Object clone
469Account balance := 0
470Account deposit := method(amount,
471    balance = balance + amount
472)
473
474account := Account clone
475account deposit(10.00)
476account balance println
477</pre>
478
479Like Self[2], Io's syntax does not distinguish between accessing a slot containing a method from one containing a variable.
480
481<a name="Syntax-Operators"></a>
482<h3>演算子</h3>
483
484演算子とは、単に英数字以外の文字による名前をもつメソッドである。例外として、&quot;:&quot;(コロン), &quot;_&quot;(アンダースコア), &apos;&quot;&apos;(ダブルクォート), &quot;.&quot;(ドット) は演算子に使えず、また次のものは英数字による名前だが演算子とする: &quot;and&quot;, &quot;or&quot;, &quot;return&quot;. 例:
485
486<pre>
4871 + 2
488</pre>
489
490すなわち次のような通常の形式のメッセージにコンパイルされる:
491
492<pre>
4931 +(2)
494</pre>
495
496括弧を使ってまとめることもできる:
497
498<pre>
4991 +(2 * 4)
500</pre>
501
502標準の演算子は、C 言語と同じ優先順位で処理される。従って:
503
504<pre>
5051 + 2 * 3 + 4
506</pre>
507
508は次のように解析される:
509
510<pre>
5111 +(2 *(3)) +(4)
512</pre>
513
514ユーザ定義の演算子 (標準の演算子名は使えない) は、常に左から右に動作する。
515
516<a name="Syntax-Assignment"></a>
517<h3>代入</h3>
518
519Io は3つの代入演算子を持つ:
520
521<p>
522<table cellpadding=2 cellspacing=0 border=0 style="margin-left:1em">
523<tr>
524<td style="width:5em">
525<b><i>operator</i></b> 
526</td>
527<td>
528<b><i>action</i></b>
529</td>
530</tr>
531
532<tr>
533<td>
534<i>::=</i>
535</td>
536<td>
537<i>スロットの生成, setter の生成, 値の代入</i>
538</td>
539</tr>
540
541<tr>
542<td>
543<i>:=</i>
544</td>
545<td>
546<i>スロットの生成, 値の代入</i>
547</td>
548</tr>
549
550<tr>
551<td>
552<i>=</i>
553</td>
554<td>
555<i>スロットが存在すれば値の代入、もしなければ例外を発生する</i>
556</td>
557</tr>
558
559</table>
560<p>
561
562These operators are compiled to normal messages whose methods can be overridden. 例:
563
564
565<p>
566<table cellpadding=2 cellspacing=0 border=0 style="margin-left:1em">
567<tr>
568<td style="width:5em">
569<b><i>ソースコード</i></b>    
570</td>
571<td>
572<b><i>コンパイル結果</i></b>
573</td>
574</tr>
575
576<tr>
577<td>
578<i>a ::= 1</i>
579</td>
580<td>
581<i>newSlot("a", 1)</i>
582</td>
583</tr>
584
585<tr>
586<td>
587<i>a := 1</i>
588</td>
589<td>
590<i>setSlot("a", 1)</i>
591</td>
592</tr>
593
594<tr>
595<td>
596<i>a = 1</i>
597</td>
598<td>
599<i>updateSlot("a", 1)</i>
600</td>
601</tr>
602
603</table>
604<p>
605       
606On Locals objects, updateSlot is overridden so it will update the slot in the object in which the method was activated if the slot is not found the locals. This is done so update assignments in methods don't require self to be an explicit target.
607
608<a name="Syntax-Numbers"></a>
609<h3>数値</h3>
610
611以下は、有効な数値フォーマットの例です:
612
613<pre>
614123
615123.456
6160.456
617.456
618123e-4
619123e4
620123.456e-7
621123.456e2
622</pre>
623
62416進数もサポートされます(どんなケースでも):
625
626<pre>
6270x0
6280x0F
6290XeE
630</pre>
631
632<a name="Syntax-Strings"></a>
633<h3>文字列</h3>
634
635Strings can be defined surrounded by a single set of double quotes with escaped quotes (and other escape characters) within.
636
637<pre>
638s := "this is a \"test\".\nThis is only a test."
639</pre>
640
641Or for strings with non-escaped characters and/or spanning many lines, triple quotes can be used.
642
643<pre>
644s := """this is a "test".
645This is only a test."""
646</pre>
647
648<a name="Syntax-Comments"></a>
649<h3>コメント</h3>
650
651コメントには //, /**/ と # のスタイルをサポートしています。 例:
652
653<pre>
654a := b // add a comment to a line
655
656/* comment out a group
657a := 1
658b := 2
659*/
660</pre>
661
662&quot;#&quot; スタイルは Unix でのスクリプトに役立ちます:
663
664<pre>
665#!/usr/local/bin/io
666</pre>
667
668これだけだ! 貴方は Io の文法について知るために必要なこと全てを知っている。 制御構造・オブジェクト・メソッド・例外は 上記で説明した構文で表現されます。
669
670
671</div>
672<h2>オブジェクト<a name="Objects"></a></h2>
673<div class=indent>
674
675<div class=quote>
676今まで考案された全ての言語 - Fortran, Algol60, Lisp, APL, Cobol, Pascal - では、プログラムは一方に受動的なデータオブジェクトを持ち、もう一方にそれを操作する実行可能なプログラムを持つ構造だった。 この二部構成を同質に塗り替え、それぞれが自身で操作できるデータ系の集合で構成したのが、オブジェクト指向プログラムである。 <br>
677- David Gelernter and Suresh J Jag
678</div>
679
680<div class=quote>
681In 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. <br>
682- David Gelernter and Suresh J Jag
683</div>
684
685<a name="Objects-Overview"></a>
686<h3>概略</h3>
687
688Io's guiding design principle is simplicity and power through conceptual unification.
689<p>
690
691<table cellpadding=2 cellspacing=0 border=0 style="margin-left:1em">
692<tr>
693<td style="width:15em">
694<b><i>concept</i></b>  
695</td>
696<td>
697<b><i>unifies</i></b>
698</td>
699</tr>
700
701<tr>
702<td>
703<i>blocks with assignable scope </i>
704</td>
705<td>
706<i>functions, methods, closures, functions</i>
707</td>
708</tr>
709
710<tr>
711<td>
712<i>prototypes</i>
713</td>
714<td>
715<i>objects, classes, namespaces, locals</i>
716</td>
717</tr>
718 
719<tr>
720<td valign=top>
721<i>messages</i>
722</td>
723<td>
724<i>operators, calls, assignment, variable accesses</i>
725</td>
726</tr>
727</table>
728
729<a name="Objects-Prototypes"></a>
730<h3>プロトタイプ</h3>
731
732Io では、(ローカルのブロック記憶領域や名前空間それ自体を含む) 全てがオブジェクトであり、(値の代入を含む) 全ての振舞いはメッセージです。 。オブジェクトはスロットというキーと値のペアのリストと、protos という継承したオブジェクトの内部リストから出来ています。 あるスロットのキーはシンボル(つまり、ユニークな不変の文字列)であり、あらゆる型のオブジェクトをその値に取ります。
733 
734新たなオブジェクトの clone と init で、既にあるオブジェクトのクローンを作成します。 あるクローンは、protos のリストにその親を持つ空のオブジェクトです。 新しいインスタンスの init スロットは有効になり、そのオブジェクトを初期化するために使われます。 NewtonScript のように、Io のスロットは create-on-write です。
735
736<pre>
737me := Person clone
738</pre>
739
740インスタンスに変数やメソッドを追加するには、単純にセットします:
741
742<pre>
743myDog name := "rover"
744myDog sit := method("I'm sitting\n" print)
745</pre>
746
747あるオブジェクトのクローンが作成されると、その init スロットがあれば、それが呼ばれます。
748
749<a name="Objects-Inheritance"></a>
750<h3>継承</h3>
751
752あるオブジェクトが該当するスロットを探すようなメッセージを受けた場合、見つからなければ、proto リストを深さ優先で再帰的に検査を続けます。 検査のループが見つかった場合には、検査は中断されます。 マッチするスロットに実行可能なオブジェクトがあれば、例えば Block や CFunction などの場合、それが実行され、値があればその値を返します。 Io にはグローバルオブジェクトはなく、Lobby という Io 名前空間のルートオブジェクトがあります。
753<p>
754クラスがないため、サブクラスとインスタンスの違いはありません。 以下は、サブクラスに相当するものを作成する例です:
755
756<pre>
757Io> Dog := Object clone
758==> Object_0x4a7c0
759</pre>
760
761上記のコードでは、Lobby の &quot;Dog&quot; スロットに Object オブジェクトのクローンをセットしています。 そのクローンは Object への参照を含む protos リストのみを持っています。 これで、本質的に Dog は Object のサブクラスとなります。 インスタンスの変数やメソッドはその proto から継承されます。 スロットがセットされた場合、proto は変更されず、作成したオブジェクトに新しいスロットを作成します:
762
763<pre>
764  Io> Dog color := "red"
765  Io> Dog
766  ==> Object_0x4a7c0:
767    color := "red"
768</pre>
769
770<h4>多重継承</h4>
771
772あるオブジェクトのprotosリストには、protoを幾つでも追加できます。 メッセージへの応答の際、検査構造は proto チェーンを深さ優先で検査します。
773
774<a name="Objects-Methods"></a>
775<h3>メソッド</h3>
776
777メソッドは、呼び出された際、生成された際のオブジェクトをローカルに保存し、そのローカルの proto ポインタとそれ自身のスロットをターゲットにメッセージをセットする匿名の関数です。 Object メソッド method() でメソッドを作成することができます。 例:
778
779<pre>
780method((2 + 2) print)
781</pre>
782
783オブジェクト内のメソッドを使用する例:
784
785<pre>
786Dog := Object clone
787Dog bark := method("woof!" print)
788</pre>
789
790上記コードは、Dog と名の付けられたオブジェクトの &quot;サブクラス&quot; を新たに作成し、&quot;woof!&quot; を出力するブロックである bark スロットを含んでいます。 メソッドを呼び出す例:
791
792<pre>
793Dog bark
794</pre>
795
796ブロックのデフォルトの戻り値は、最後の式の結果になります。
797
798<h4>引数</h4>
799
800メソッドは引数をとるようにも定義できる。 例:
801
802<pre>
803add := method(a, b, a + b)
804</pre>
805
806一般的な形式:
807
808<pre><i>
809method(&lt;arg name 0&gt;, &lt;arg name 1&gt;, ..., &lt;do message&gt;)
810</i></pre>
811
812<a name="Objects-Blocks"></a>
813<h3>ブロック</h3>
814
815ブロックは変数のスコープの違いを除いて、メソッドと同じです。 つまり変数検査は、ブロックが実行されるメッセージのターゲットの代わりに、ブロックが生成された時点での文脈に従います。 ブロックは Object の block() メソッドで生成できます。 ブロックを生成する例:
816
817<pre>
818b := block(a, a + b)
819</pre>
820
821<h4>ブロック vs メソッド</h4>
822
823混乱の種になりそうなので、詳細を説明します。 両方とも、呼び出されるとローカル領域にオブジェクトを作成するのは同じです。 違いは、ローカル領域のオブジェクト &quot;proto&quot; と &quot;self&quot; に何がセットされるかです。 メソッドでは、それらのスロットには、メッセージのターゲットがセットされる。 ブロックでは、そのブロックが作り出されたときのローカル領域オブジェクトがセットされる。 従ってブロック中では、ローカル領域にない変数は、そのブロックが作成されたときのローカル領域を辿って検索される。 そしてメソッド中では、ローカル領域にない変数は、そのメソッドを呼び出したオブジェクトを辿って検索される。
824
825<h4>call と self スロット</h4>
826
827ローカル領域にオブジェクトが作られる際、その self スロットには、メソッドの場合はメッセージのターゲット、ブロックの場合は生成時の文脈に沿ってセットされ、call スロットには Call オブジェクトがセットされ、ブロック実行時のアクセス情報が参照できます:
828
829<p>
830<table cellpadding=2 cellspacing=0 border=0 style="margin-left:1em">
831<tr>
832<td style="width:10em">
833<b><i>slot</i></b>
834</td><td>
835<b><i>returns</i></b>
836</td>
837</tr>
838<tr>
839<td>
840<i>call sender </i>
841</td><td>
842<i>呼び出し側のローカルオブジェクト</i>
843</td>
844</tr>
845<tr>
846<td>
847<i>call message </i>
848</td><td>
849<i>メソッドまたは、ブロックへの呼び出し時に使われたメッセージ</i>
850</td>
851</tr>
852<tr>
853<td>
854<i>call activated</i>
855</td><td>
856<i>実行されたメソッドまたはブロック</i>
857</td>
858</tr>
859<tr>
860<td>
861<i>call slotContext</i>
862</td><td>
863<i>スロットが見つかった文脈</i>
864</td>
865</tr>
866<tr>
867<td>
868<i>call target</i>
869</td><td>
870<i>カレントオブジェクト</i>
871</td>
872</tr>
873</table>
874
875<h4>可変長引数</h4>
876
877The "call message" slot in locals can be used to access the unevaluated argument messages. Example of implementing if() within Io:
878
879<pre>
880myif := method(
881    (call sender doMessage(call message argAt(0))) ifTrue(
882    call sender doMessage(call message argAt(1))) ifFalse(
883    call sender doMessage(call message argAt(2)))
884)
885
886myif(foo == bar, write("true\n"), write("false\n"))
887</pre>
888
889The doMessage() method evaluates the argument in the context of the receiver.
890
891A shorter way to express this is to use the evalArgAt() method on the call object:
892
893<pre>
894myif := method(
895    call evalArgAt(0) ifTrue(
896    call evalArgAt(1)) ifFalse(
897    call evalArgAt(2))
898)
899
900myif(foo == bar, write("true\n"), write("false\n"))
901</pre>
902
903<a name="Objects-Forward"></a>
904<h3>転送</h3>
905
906If an object doesn't respond to a message, it will invoke its "forward" method if it has one. Here's an example of how to print the information related lookup that failed:
907
908<pre>
909MyObject forward := method(
910    write("sender = ", call sender, "\n")
911    write("message name = ", call message name, "\n")
912    args := call message argsEvaluatedIn(call sender)
913    args foreach(i, v, write("arg", i, " = ", v, "\n") )
914)
915</pre>
916
917<a name="Objects-Forward"></a>
918<h3>再送</h3>
919
920Sends the current message to the receiver's proto with the context of self. 例:
921
922<pre>
923A := Object clone
924A m := method(write("in A\n"))
925B := A clone
926B m := method(write("in B\n"); resend)
927B m
928</pre>
929
930will print:
931
932<pre>
933in B
934in A
935</pre>
936
937For sending other messages to the receiver's proto, super is used.
938
939<a name="Objects-Super"></a>
940<h3>スーパー</h3>
941
942Sometimes it's necessary to send a message directly to a proto. 例:
943
944<pre>
945Dog := Object clone
946Dog bark := method(writeln("woof!"))
947
948fido := Dog clone
949fido bark := method(
950    writeln("ruf!")
951    super(bark)
952)
953</pre>
954
955Both resend and super are implemented in Io.
956
957<a name="Objects-Introspection"></a>
958<h3>イントロスペクション</h3>
959
960Using the following methods you can introspect the entire Io namespace. There are also methods for modifying any and all of these attributes at runtime.
961
962<h4>slotNames</h4>
963
964The slotNames method returns a list of the names of an object's slots:
965
966<pre>
967Io> Dog slotNames
968==> list("bark")
969</pre>
970
971<h4>protos</h4>
972
973The protos method returns a list of the objects which an object inherits from:
974
975<pre>
976Io> Dog protos
977==> list("Object")
978</pre>
979
980<h4>getSlot</h4>
981
982The "getSlot" method can be used to get the value of a block in a slot without activating it:
983
984<pre>
985myMethod := Dog getSlot("bark")
986</pre>
987
988Above, we've set the locals object's "myMethod" slot to the bark method. It's important to remember that if you then want use the myMethod without activating it, you'll need to use the getSlot method:
989
990<pre>
991otherObject newMethod := getSlot("myMethod")
992</pre>
993
994Here, the target of the getSlot method is the locals object.
995
996<h4>code</h4>
997
998The arguments and expressions of methods are open to introspection. A useful convenience method is "code", which returns a string representation of the source code of the method in a normalized form.
999
1000<pre>
1001Io> method(a, a * 2) code
1002==> "method(a, a *(2))"
1003</pre>
1004
1005</div>
1006<h2>コントロール・フロー<a name="Control-Flow"></a></h2>
1007<div class=indent>
1008
1009<a name="Control-Flow-true-false-and-nil"></a>
1010<h3>true, false と nil</h3>
1011
1012Io has predefined singletons 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.
1013
1014<a name="Control-Flow-Comparison"></a>
1015<h3>比較</h3>
1016
1017The standard comparison operations (==, !=, >=, <=, >, <) return either the true or false.
1018
1019<pre>
1020Io> 1 < 2
1021==> true
1022</pre>
1023
1024The compare() method is used to implement the compare methods and returns -1, 0 or 1.
1025
1026<a name="Control-Flow-Conditions"></a>
1027<h3>条件分岐</h3>
1028
1029<h4>if</h4>
1030
1031The Lobby contains the condition and loop methods. A condition looks like:
1032
1033<pre><i>
1034if(&lt;condition&gt;, &lt;do message&gt;, &lt;else do message&gt;)
1035</i></pre>
1036
1037例:
1038
1039<pre>
1040if(a == 10, "a is 10" print)
1041</pre>
1042
1043The else argument is optional. The condition is considered false if the condition expression evaluates to false or nil, and is considered true otherwise.
1044<p>
1045The result of the evaluated message is returned, so:
1046
1047<pre>
1048if(y < 10, x := y, x := 0)
1049</pre>
1050
1051is the same as:
1052
1053<pre>
1054x := if(y < 10, y, 0)
1055</pre>
1056
1057Conditions can also be used in this form (though not as efficiently):
1058
1059<pre>
1060if(y < 10) then(x := y) else(x := 2)
1061</pre>
1062
1063Else-if is supported:
1064
1065<pre>
1066if(y < 10) then(x := y) elseif(y == 11) then(x := 0) else(x := 2)
1067</pre>
1068
1069As well as Smalltalk style ifTrue, ifFalse, ifNil and ifNonNil methods:
1070
1071<pre>
1072(y < 10) ifTrue(x := y) ifFalse(x := 2)
1073</pre>
1074
1075Notice that the condition expression must have parenthesis surrounding it.
1076
1077<a name="Control-Flow-Loops"></a>
1078<h3>ループ</h3>
1079
1080<h4>loop</h4>
1081
1082loop メソッドは &quot;無限&quot; ループに使われます:
1083
1084<pre>
1085loop("foo" println)
1086</pre>
1087
1088<h4>while</h4>
1089
1090条件分岐のように、ループは単なるメッセージです。 while() は次の引数を必要とします:
1091
1092<pre><i>
1093while(&lt;condition&gt;, &lt;do message&gt;)
1094</i></pre>
1095
1096例:
1097
1098<pre>
1099a := 1
1100while(a < 10,
1101    a print
1102    a = a + 1
1103)
1104</pre>
1105
1106<h4>for</h4>
1107
1108for() は次の引数を必要とします:
1109
1110<pre><i>
1111for(&lt;counter&gt;, &lt;start&gt;, &lt;end&gt;, &lt;optional step&gt;, &lt;do message&gt;)
1112</i></pre>
1113
1114start と end のメッセージは、ループの開始時に一度だけ評価されます。
1115
1116例:
1117
1118<pre>
1119for(a, 0, 10,
1120    a println
1121)
1122</pre>
1123
1124ステップによる例:
1125
1126<pre>
1127for(x, 0, 10, 3, x println)
1128</pre>
1129
1130次の出力になります:
1131
1132<pre>
11330
11343
11356
11369
1137</pre>
1138
1139ループを逆順に実行するには、負の値をステップに加えてください:
1140
1141<pre>
1142for(a, 10, 0, -1, a println)
1143</pre>
1144
1145Note: 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.
1146
1147Example of using a block in a loop:
1148
1149<pre>
1150test := method(v, v print)
1151for(i, 1, 10, test(i))
1152</pre>
1153
1154<h4>repeat</h4>
1155
1156The Number repeat method is simpler and more efficient when a counter isn't needed.
1157
1158<pre>
11593 repeat("foo" print)
1160==> foofoofoo
1161</pre>
1162
1163<h4>break と continue</h4>
1164
1165フロー制御オペレーションの break と continue は ループ中でサポートされます。 例:
1166
1167<pre>
1168for(i, 1, 10,
1169    if(i == 3, continue)
1170    if(i == 7, break)
1171    i print
1172)
1173</pre>
1174
1175出力結果:
1176
1177<pre>
117812456
1179</pre>
1180
1181<h4>return</h4>
1182
1183ブロックのどの部分でも return メソッドを使用して即座に返ることができます。 例:
1184
1185<pre>
1186Io> test := method(123 print; return "abc"; 456 print)
1187Io> test
1188123
1189==> abc
1190</pre>
1191
1192</div>
1193<h2>インポート<a name="Importing"></a></h2>
1194<div class=indent>
1195
1196The Importer proto implements Io's built-in auto importer feature. If you put each of your proto's in their own file, and give the file the same name with and ".io" extension, the Importer will automatically import that file when the proto is first referenced. The Importer's default search path is the current working directory, but can add search paths using its addSearchPath() method.
1197
1198</div>
1199<h2>並行動作<a name="Concurrency"></a></h2>
1200<div class=indent>
1201
1202<a name="Concurrency-Coroutines"></a>
1203<h3>コルーチン</h3>
1204
1205Io uses coroutines (user level cooperative threads), 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.
1206
1207<a name="Concurrency-Scheduler"></a>
1208<h3>スケジューラ</h3>
1209
1210The 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.
1211
1212<a name="Concurrency-Actors"></a>
1213<h3>アクタ</h3>
1214
1215An actor is an object with its own thread (in our case, its own coroutine) which it uses to process its 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")
1216<p>
1217例:
1218
1219<pre>
1220result := self foo // synchronous
1221futureResult := self @foo // async, immediately returns a Future
1222self @@foo // async, immediately returns nil
1223</pre>
1224
1225When 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". 例:
1226
1227<pre>
1228obj1 := Object clone
1229obj1 test := method(for(n, 1, 3, n print; yield))
1230obj2 := obj1 clone
1231obj1 @@test; obj2 @@test
1232while(Scheduler yieldingCoroutines size > 1, yield)
1233</pre>
1234
1235これは &quot;112233&quot; と出力される.
1236
1237Here's a more real world example:
1238
1239<pre>
1240HttpServer handleRequest := method(aSocket,
1241    HttpRequestHandler clone @@handleRequest(aSocket)
1242)
1243</pre>
1244
1245<a name="Concurrency-Futures"></a>
1246<h3>Future</h3>
1247
1248Io'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.
1249
1250<h4>自動デッドロック検知</h4>
1251
1252An 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. It performs this check by traversing the list of connected futures.
1253
1254<h4>@ 演算子と @@ 演算子</h4>
1255
1256The @ or @@ before an asynchronous message is just a normal operator message. So:
1257
1258<pre>
1259self @test
1260</pre>
1261
1262Gets parsed as(and can be written as):
1263
1264<pre>
1265self @(test)
1266</pre>
1267
1268<h4>Futures and the Command Line Interface</h4>
1269
1270The command line will attempt to print the result of expressions evaluated in it, so if the result is a Future, it will attempt to print it and this will wait on the result of Future. 例:
1271
1272<pre>
1273Io> q := method(wait(1))
1274Io> @q
1275[1-second delay]
1276==> nil
1277</pre>
1278
1279To avoid this, just make sure the Future isn't the result. 例:
1280
1281<pre>
1282Io> @q; nil
1283[no delay]
1284==> nil
1285</pre>
1286
1287<a name="Concurrency-Yield"></a>
1288<h3>Yield</h3>
1289
1290An 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.
1291
1292<a name="Concurrency-Pause-and-Resume"></a>
1293<h4>一時停止と再開</h4>
1294
1295It's also possible to pause and resume an object. See the concurrency methods of the Object primitive for details and related methods.
1296
1297</div>
1298<h2>例外<a name="Exceptions"></a></h2>
1299<div class=indent>
1300
1301<a name="Exceptions-Raise"></a>
1302<h3>例外の発生</h3>
1303
1304An exception can be raised by calling raise() on an exception proto.
1305
1306<pre>
1307Exception raise("generic foo exception")
1308</pre>
1309
1310<!--
1311<pre><i>
1312exceptionProto raise(&lt;description&gt;)
1313</i></pre>
1314
1315There are three predefined children of the Exception proto: Error, Warning and Notification. Examples:
1316
1317<pre>
1318Exception raise("generic foo exception")
1319Warning raise("No defaults found, creating them")
1320Error raise("Not enough memory")
1321</pre>
1322-->
1323
1324<a name="ExceptionsTry-and-Catch"></a>
1325<h3>Try と Catch</h3>
1326
1327To 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.
1328
1329<pre><i>
1330e := try(&lt;doMessage&gt;)
1331</i></pre>
1332
1333To catch a particular exception, the Exception catch() method can be used. 例:
1334
1335<pre>
1336e := try(
1337    // ...
1338)
1339
1340e catch(Exception,
1341    writeln(e coroutine backtraceString)
1342)
1343</pre>
1344
1345
1346The 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.
1347
1348<a name="Exceptions-Pass"></a>
1349<h3>Pass</h3>
1350
1351To 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:
1352
1353<pre>
1354e := try(
1355    // ...
1356)
1357
1358e catch(Error,
1359    // ...
1360) catch(Exception,
1361    // ...
1362) pass
1363</pre>
1364
1365
1366<a name="Exceptions-Custom"></a>
1367<h3>カスタム例外</h3>
1368
1369Custom exception types can be implemented by simply cloning an existing Exception type:
1370
1371<pre>
1372MyErrorType := Error clone
1373</pre>
1374
1375</div>
1376<h2>プリミティブ<a name="Primitives"></a></h2>
1377<div class=indent>
1378
1379プリミティブは Io の組込みオブジェクトで、主に C で実装され、幾つか隠蔽データを持っています。 例えば、Number プリミティブは倍制度浮動小数点数のデータを隠蔽し、計算操作のメソッドは C 関数で実装されています。 全ての Io プリミティブは Object プロトタイプを継承し、可変です。 つまりそのメソッドは変更可能です。 より詳しい情報は、リファレンスドキュメントを参照してください。
1380<p>
1381
1382このドキュメントはリファレンスマニュアルではなく、基底プリミティブについての概説であり、さくっと触り、何が出来るかを書いています。リファレンスドキュメントのどこを見れば詳しく書いてあるかもわかるでしょう。
1383
1384<a name="Primitives-Object"></a>
1385<h3>オブジェクト</h3>
1386
1387<h4>? 演算子</h4>
1388
1389Sometimes it's desirable to conditionally call a method only if it exists (to avoid raising an exception). 例:
1390
1391<pre>
1392if(obj getSlot("foo"), obj foo)
1393</pre>
1394
1395Putting a "?" before a message has the same effect:
1396
1397<pre>
1398obj ?foo
1399</pre>
1400
1401<a name="Primitives-List"></a>
1402<h3>リスト</h3>
1403
1404リストは配列の参照であり、すべての標準的な配列操作と列挙のメソッドをサポートします。 例:
1405<p>
1406空のリストを生成:
1407
1408<pre>
1409a := List clone
1410</pre>
1411
1412list() メソッドを使用することで、任意のリストを生成することができます:
1413
1414<pre>
1415a := list(33, "a")
1416</pre>
1417
1418アイテムの追加:
1419
1420<pre>
1421a append("b")
1422==> list(33, "a", "b")
1423</pre>
1424
1425リストのサイズを取得:
1426
1427<pre>
1428a size
1429==> 3
1430</pre>
1431
1432インデックスを指定し、アイテムの取得(リストのインデックスはゼロから開始されます):
1433
1434<pre>
1435a at(1)
1436==> "a"
1437</pre>
1438
1439注: リストのインデックスはゼロから開始されます。また、アクセスしたインデックスが存在しない場合は nil を返します。
1440<p>
1441インデックスを指定し、アイテムのセット:
1442
1443<pre>
1444a atPut(2, "foo")
1445==> list(33, "a", "foo", "b")
1446
1447a atPut(6, "Fred")
1448==> Exception: index out of bounds
1449</pre>
1450
1451インデックスを指定し、アイテムの削除:
1452
1453<pre>
1454a remove("foo")
1455==> list(33, "a", "b")
1456</pre>
1457
1458インデックスを指定し、アイテムの挿入:
1459
1460<pre>
1461a atPut(2, "foo")
1462==> list(33, "a", "foo", "56")
1463</pre>
1464
1465<h4>foreach</h4>
1466
1467The foreach, map and select methods can be used in three forms:
1468
1469<pre>
1470Io> a := list(65, 21, 122)
1471</pre>
1472
1473In the first form, the first argument is used as an index variable, the second as a value variable and the 3rd as the expression to evaluate for each value.
1474
1475<pre>
1476Io> a foreach(i, v, write(i, ":", v, ", "))
1477==> 0:65, 1:21, 2:122,
1478</pre>
1479
1480The second form removes the index argument:
1481
1482<pre>
1483Io> a foreach(v, v println)
1484==> 65
148521
1486122
1487</pre>
1488
1489The third form removes the value argument and simply sends the expression as a message to each value:
1490
1491<pre>
1492Io> a foreach(println)
1493==> 65
149421
1495122
1496</pre>
1497
1498<h4>map and select</h4>
1499
1500Io's map and select (known as filter in some other languages) methods allow arbitrary expressions as the map/select predicates.
1501
1502<pre>
1503Io> numbers := list(1, 2, 3, 4, 5, 6)
1504
1505Io> numbers select(isOdd)
1506==> list(1, 3, 5)
1507
1508Io> numbers select(x, x isOdd)
1509==> list(1, 3, 5)
1510
1511Io> numbers select(i, x, x isOdd)
1512==> list(1, 3, 5)
1513
1514Io> numbers map(x, x*2)
1515==> list(2, 4, 6, 8, 10, 12)
1516
1517Io> numbers map(i, x, x+i)
1518==> list(1, 3, 5, 7, 9, 11)
1519
1520Io> numbers map(*3)
1521==> list(3, 6, 9, 12, 15, 18)
1522</pre>
1523
1524The map and select methods return new lists. To do the same operations in-place, you can use selectInPlace() and mapInPlace() methods.
1525
1526<a name="Primitives-Sequence"></a>
1527<h3>Sequence</h3>
1528
1529Io では、Symbol と呼ぶ不変 Sequence と、Buffer や String と同等な可変 Sequence があります。 文字列(ソースコード内で&quot;&quot;で囲まれたものが一例)は Symbol です。 変更操作は Symbol では実行されないので、asMutable メソッドで Symbol の可変なコピーを作成し、そのコピーに対して変更操作を実行します。
1530共通して、文字列の長さを取得する操作があります:
1531<pre>
1532"abc" size
1533==> 3
1534</pre>
1535
1536部分一致をチェック:
1537
1538<pre>
1539"apples" containsSeq("ppl")
1540==> true
1541</pre>
1542
1543位置Nの文字 (byte) を取得:
1544
1545<pre>
1546"Kavi" at(1)
1547==> 97
1548</pre>
1549
1550スライス:
1551
1552<pre>
1553"Kirikuro" slice(0, 2)
1554==> "Ki"
1555
1556"Kirikuro" slice(-2)  # NOT: slice(-2, 0)!
1557==> "ro"
1558
1559Io> "Kirikuro" slice(0, -2)
1560# "Kiriku"
1561</pre>
1562
1563ホワイトスペース除去:
1564
1565<pre>
1566"  abc  " adMutable strip
1567==> "abc"
1568
1569"  abc  " asMutable lstrip
1570==> "abc  "
1571
1572"  abc  " asMutable rstrip
1573==> "  abc"
1574</pre>
1575
1576大文字 / 小文字変換:
1577
1578<pre>
1579"Kavi" asUppercase
1580==> "KAVI"
1581"Kavi" asLowercase
1582==> "kavi"
1583</pre>
1584
1585文字列の分割:
1586
1587<pre>
1588"the quick brown fox" split
1589==> list("the", "quick", "brown", "fox")
1590</pre>
1591
1592同様に、他の文字で分割も可能
1593
1594<pre>
1595"a few good men" split("e")
1596==> list("a f", "w good m", "n")
1597</pre>
1598
1599数値へ変換:
1600
1601<pre>
1602"13" asNumber
1603==> 13
1604
1605"a13" asNumber
1606==> nil
1607</pre>
1608
1609文字列の補間:
1610
1611<pre>
1612name := "Fred"
1613==> Fred
1614"My name is #{name}" interpolate
1615==> My name is Fred
1616 </pre>
1617
1618Interpolate は #{} で囲まれた全てを、Io のローカルの文脈コードとして評価します。 コードには制御構文も記述できますが、 asString に対応するオブジェクトを返却する必要があります。
1619
1620<a name="Primitives-Ranges"></a>
1621<h3>Ranges</h3>
1622
1623A 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.
1624
1625<h4>The Range protocol</h4>
1626
1627Each 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. 例:
1628
1629<pre>
1630Number nextInSequence := method(skipVal,
1631    if(skipVal isNil, skipVal = 1)
1632    self + skipVal
1633)
1634</pre>
1635
1636With this method on Number (it's already there in the standard libraries), you can then use Numbers in Ranges, as demonstrated below:
1637
1638<pre>
16391 to(5) foreach(v, v println)
1640</pre>
1641
1642The above will print 1 through 5, each on its own line.
1643
1644<a name="Primitives-File"></a>
1645<h3>ファイル</h3>
1646
1647The 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. 例:
1648
1649<pre>
1650f := File with("foo.txt)
1651f remove
1652f openForUpdating
1653f write("hello world!")
1654f close
1655</pre>
1656
1657<a name="Primitives-Directory"></a>
1658<h3>ディレクトリ</h3>
1659
1660ディレクトリ(directory) オブジェクトの生成:
1661
1662<pre>
1663dir := Directory with("/Users/steve/")
1664</pre>
1665
1666ディレクトリ内の全てのファイルのファイルオブジェクトのリストを取得:
1667
1668<pre>
1669files := dir files
1670==> list(File_0x820c40, File_0x820c40, ...)
1671</pre>
1672
1673Get a list of both the file and directory objects in a directory:
1674
1675<pre>
1676items := Directory items
1677==> list(Directory_0x8446b0, File_0x820c40, ...)
1678
1679items at(4) name
1680==> DarkSide-0.0.1 # a directory name
1681</pre>
1682
1683Setting a Directory object to a certain directory and using it:
1684
1685<pre>
1686root := Directory clone setPath("c:/")
1687==> Directory_0x8637b8
1688
1689root fileNames
1690==> list("AUTOEXEC.BAT", "boot.ini", "CONFIG.SYS", ...)
1691</pre>
1692
1693Testing for existence:
1694
1695<pre>
1696Directory clone setPath("q:/") exists
1697==> false
1698</pre>
1699
1700Getthing the current working directory:
1701
1702<pre>
1703Directory currentWorkingDirectory
1704==> "/cygdrive/c/lang/IoFull-Cygwin-2006-04-20"
1705</pre>
1706
1707<a name="Primitives-Date"></a>
1708<h3>日付</h3>
1709
1710Creating a new date instance:
1711
1712<pre>
1713d := Date clone
1714</pre>
1715
1716Setting it to the current date/time:
1717
1718<pre>
1719d now
1720</pre>
1721
1722Getting the date/time as a number, in seconds:
1723
1724<pre>
1725Date now asNumber
1726==> 1147198509.417114
1727
1728Date now asNumber
1729==> 1147198512.33313
1730</pre>
1731
1732Getting individual parts of a Date object:
1733
1734<pre>
1735d := Date now
1736==> 2006-05-09 21:53:03 EST
1737
1738d
1739==> 2006-05-09 21:53:03 EST
1740
1741d year
1742==> 2006
1743
1744d month
1745==> 5
1746
1747d day
1748==> 9
1749
1750d hour
1751==> 21
1752
1753d minute
1754==> 53
1755
1756d second
1757==> 3.747125
1758</pre>
1759
1760Find how long it takes to execute some code:
1761
1762<pre>
1763Date cpuSecondsToRun(100000 repeat(1+1))
1764==> 0.02
1765</pre>
1766
1767<a name="Primitives-Networking"></a>
1768<h3>ネットワーク</h3>
1769
1770All of Io'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'll need to first reference the associated addon in order to cause it to load before using its objects. In these examples, you'll have to reference "Socket" to get the Socket addon to load first.
1771<p>
1772URL オブジェクトの生成:
1773
1774<pre>
1775url := URL with("http://example.com/")
1776</pre>
1777
1778Fetching an URL:
1779
1780<pre>
1781data := url fetch 
1782</pre>
1783
1784Streaming a URL to a file:
1785
1786<pre>
1787url streamTo(File with("out.txt"))
1788</pre>
1789
1790A simple whois client:
1791
1792<pre>
1793whois := method(host,
1794    socket := Socket clone setHostName("rs.internic.net") setPort(43)
1795    socket connect streamWrite(host, "\n")
1796    while(socket streamReadNextChunk, nil)
1797    return socket readBuffer
1798)
1799</pre>
1800
1801A minimal web server:
1802
1803<pre>
1804WebRequest := Object clone do(
1805    handleSocket := method(aSocket,
1806        aSocket streamReadNextChunk
1807        request := aSocket readBuffer betweenSeq("GET ", " HTTP")
1808        f := File with(request)
1809        if(f exists, f streamTo(aSocket), aSocket streamWrite("not found"))
1810        aSocket close
1811    )
1812)
1813
1814WebServer := Server clone do(
1815    setPort(8000)
1816    handleSocket := method(aSocket,
1817        WebRequest clone @handleSocket(aSocket)
1818    )
1819)
1820
1821WebServer start
1822</pre>
1823
1824<a name="Primitives-XML"></a>
1825<h3>XML</h3>
1826
1827Using the XML parser to find the links in a web page:
1828
1829<pre>
1830SGML // reference this to load the SGML addon
1831xml := URL with("http://www.yahoo.com/") fetch asXML
1832links := xml elementsWithName("a") map(attributes at("href"))
1833</pre>
1834
1835<a name="Primitives-Vector"></a>
1836<h3>Vector</h3>
1837
1838Io's Vectors are built on its Sequence primitive and are defined as:
1839
1840<pre>
1841Vector := Sequence clone setItemType("float32")
1842</pre>
1843
1844The Sequence primitive supports SIMD acceleration on a number of float32 operations. Currently these include add, subtract, multiple and divide but in the future can be extended to support most math, logic and string manipulation related operations.
1845
1846Here's a small example:
1847
1848<pre>
1849iters := 1000
1850size := 1024
1851ops := iters * size
1852
1853v1 := Vector clone setSize(size) rangeFill
1854v2 := Vector clone setSize(size) rangeFill
1855
1856dt := Date secondsToRun(
1857    iters repeat(v1 *= v2)
1858)
1859
1860writeln((ops/(dt*1000000000)) asString(1, 3), " GFLOPS")
1861</pre>
1862
1863Which when run on 2Ghz Mac Laptop, outputs:
1864
1865<pre>
18661.255 GFLOPS
1867</pre>
1868
1869A similar bit of C code (without SIMD acceleration) outputs:
1870
1871<pre>
18720.479 GFLOPS
1873</pre>
1874
1875So for this example, Io is about three times faster than plain C.
1876
1877<!--
1878</div>
1879<h2>Metaprogramming<a name="Metaprogramming"></a></h2>
1880<div class=indent>
1881
1882</i>forthcoming...
1883
1884Object
1885setIsActivatable
1886forward
1887introspection
1888getSlot, slotSummary, docs, namespaces
1889Block
1890setScope()
1891setPassStops()
1892setDoesCatchStops()
1893doesCatchStops
1894setMessage()
1895Message
1896Manipulating Message Trees
1897setNext()
1898setArgumentNames()
1899setCachedResult()
1900Syntax
1901squareBrackets()
1902curlyBrackets()
1903operators
1904adding
1905precedence ordering
1906-->
1907
1908</div>
1909<h2>Unicode<a name="Unicode"></a></h2>
1910<div class=indent>
1911
1912<a name="Unicode-Sequences"></a>
1913<h3>Sequences</h3>
1914
1915In Io, symbols, strings, and vectors are unified into a single Sequence prototype which is an array of any available hardware data type such as:
1916 
1917<pre>
1918uint8, uint16, uint32, uint64
1919int8, int16, int32, int64
1920float32, float64
1921</pre>
1922
1923<a name="Unicode-Supported-Encodings"></a>
1924<h3>サポートしているエンコード</h3>
1925
1926Also, a Sequence has a encoding attribute, which can be:
1927
1928<pre>
1929number, ascii, ucs2, ucs4, utf8
1930</pre>
1931
1932UCS-2 and UCS-4 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.
1933<p>
1934UTF encodings are assumed to be big endian.
1935<p>
1936Except for input and output, all strings should be kept in a fixed character width encoding. This design allows for a simpler implementation, code sharing between vector and string ops, fast index-based access, and SIMD acceleration of Sequence operations. All Sequence methods will do automatic type conversions as needed.
1937
1938<a name="Unicode-Source"></a>
1939<h3>Source</h3>
1940
1941Io 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. 例:
1942
1943<pre>
1944Io> "hello" encoding
1945==> ascii
1946
1947Io> "π" encoding
1948==> ucs2
1949
1950Io> "∞" encoding
1951==> ucs2
1952</pre>
1953
1954
1955
1956We can also inspect the internal representation:
1957
1958<pre>
1959Io> "π" itemType
1960==> uint16
1961
1962Io> "π" itemSize
1963==> 2
1964</pre>
1965
1966<a name="Unicode-Conversion"></a>
1967<h3>変換</h3>
1968
1969Sequence オブジェクトにはいくつかの変換メソッドがあります:
1970
1971<pre>
1972asUTF8
1973asUCS2
1974asUCS4
1975</pre>
1976
1977
1978</div>
1979<h2>組み込み<a name="Embedding"></a></h2>
1980<div class=indent>
1981
1982<a name="Embedding-Conventions"></a>
1983<h3>Conventions</h3>
1984
1985Io'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.
1986
1987<h4>Structures</h4>
1988
1989Member 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.
1990
1991例:
1992
1993<pre>
1994typdef struct
1995{
1996    char *firstName;
1997    char *lastName;
1998    char *address;
1999} Person;
2000</pre>
2001
2002<h4>Functions</h4>
2003
2004Function 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.
2005<p>
2006
2007例:
2008
2009<pre>
2010List *List_new(void);
2011void List_free(List *self);
2012</pre>
2013
2014All 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.
2015<p>
2016例:
2017
2018<pre>
2019int List_count(List *self); /* no argument */
2020void List_add_(List *self, void *item); /* one argument */
2021void Dictionary_key_value_(Dictionary *self, char *key, char *value);
2022</pre>
2023
2024<h4>File Names</h4>
2025
2026Each structure has its 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.
2027
2028<a name="Embedding-IoState"></a>
2029<h3>IoState</h3>
2030
2031An IoState can be thought of as an instance of an Io "virtual machine", although "virtual machine" is a less appropriate term because it implies a particular type of implementation.
2032
2033<h4>Multiple states</h4>
2034
2035Io 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.
2036
2037<h4>Creating a state</h4>
2038Here's a simple example of creating a state, evaluating a string in it, and freeing the state:
2039
2040<pre>
2041#include "IoState.h"
2042
2043int main(int argc, const char *argv[])
2044{
2045    IoState *self = IoState_new();
2046    IoState_init(self);
2047    IoState_doCString_(self, "writeln(\"hello world!\"");
2048    IoState_free(self);
2049    return 0;
2050}
2051</pre>
2052
2053<a name="Embedding-Values"></a>
2054<h3>Values</h3>
2055
2056We can also get return values and look at their types and print them:
2057
2058<pre>
2059IoObject *v = IoState_doCString_(self, someString);
2060char *name = IoObject_name(v);
2061printf("return type is a ‘%s', name);
2062IoObject_print(v);
2063</pre>
2064
2065<h4>Checking value types</h4>
2066
2067There are some macro short cuts to help with quick type checks:
2068
2069<pre>
2070if (ISNUMBER(v))
2071{
2072    printf("result is the number %f", IoNumber_asFloat(v));
2073}
2074else if(ISSEQ(v))
2075{
2076    printf("result is the string %s", IoSeq_asCString(v));
2077}
2078else if(ISLIST(v))
2079{
2080    printf("result is a list with %i elements", IoList_rawSize(v));
2081}
2082</pre>
2083
2084Note 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.
2085
2086</div>
2087<h2>バインディング<a name="Bindings"></a></h2>
2088<div class=indent>
2089
2090Documentation on how to write bindings/addons forthcoming..
2091
2092</div>
2093<h2>付録<a name="Appendix"></a></h2>
2094<div class=indent>
2095
2096<a name="Appendix-Grammar"></a>
2097<h3>文法</h3>
2098
2099<h4>messages</h4>
2100<pre>
2101expression ::= { message | sctpad }
2102message ::= [wcpad] symbol [scpad] [arguments]
2103arguments ::= Open [argument [ { Comma argument } ]] Close
2104argument ::= [wcpad] expression [wcpad]
2105symbols
2106symbol ::= Identifier | number | Operator | quote
2107Identifier ::= { letter | digit | "_" }
2108Operator ::= { ":" | "." | "'" | "~" | "!" | "@" | "$" |
2109"%" | "^" | "&" | "*" | "-" | "+" | "/" | "=" | "{" | "}" |
2110"[" | "]" | "|" | "\" | "<" | ">" | "?" }
2111</pre>
2112
2113<h4>quotes</h4>
2114<pre>
2115quote ::= MonoQuote | TriQuote
2116MonoQuote ::= """ [ "\"" | not(""")] """
2117TriQuote ::= """"" [ not(""""")] """""
2118</pre>
2119
2120<h4>spans</h4>
2121<pre>
2122Terminator ::= { [separator] ";" | "\n" | "\r" [separator] }
2123separator ::= { " " | "\f" | "\t" | "\v" }
2124whitespace ::= { " " | "\f" | "\r" | "\t" | "\v" | "\n" }
2125sctpad ::= { separator | Comment | Terminator }
2126scpad ::= { separator | Comment }
2127wcpad ::= { whitespace | Comment }
2128</pre>
2129
2130<h4>comments</h4>
2131<pre>
2132Comment ::= slashStarComment | slashSlashComment | poundComment
2133slashStarComment ::= "/*" [not("*/")] "*/"
2134slashSlashComment ::= "//" [not("\n")] "\n"
2135poundComment ::= "#" [not("\n")] "\n"
2136</pre>
2137
2138<h4>numbers</h4>
2139<pre>
2140number ::= HexNumber | Decimal
2141HexNumber ::= "0" anyCase("x") { [ digit | hexLetter ] }
2142hexLetter ::= "a" | "b" | "c" | "d" | "e" | "f"
2143Decimal ::= digits | "." digits | digits "." digits ["e" [-] digits]
2144</pre>
2145
2146<h4>characters</h4>
2147<pre>
2148Comma ::= ","
2149Open ::= "(" | "[" | "{"
2150Close ::= ")" | "]" | "}"
2151letter ::= "a" ... "z" | "A" ... "Z"
2152digit ::= "0" ... "9"
2153digits ::= { digit }
2154</pre>
2155
2156<a name="Appendix-Credits"></a>
2157<h3>協力者</h3>
2158
2159Io 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, Rich Collins, Oliver Ansaldi, James Burgess, 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.
2160
2161
2162<a name="Appendix-References"></a>
2163<h3>参考</h3>
2164
2165
2166<table cellpadding=0 cellspacing=0 border=0>
2167<tr>
2168<td style="width:3em" valign=top>
21691
2170</td>
2171<td>    
2172Goldberg, A et al. <br>
2173Smalltalk-80: The Language and Its Implementation<br>
2174Addison-Wesley, 1983<br>
2175</td>
2176</tr>
2177
2178<tr><td colspan=2 style="height:1em"></td></tr>
2179
2180<tr>
2181<td valign=top>
21822
2183</td>
2184<td>
2185Ungar, D and Smith, <br>
2186RB. Self: The Power of Simplicity<br>
2187OOPSLA, 1987<br>
2188</td>
2189</tr>
2190
2191<tr><td colspan=2 style="height:1em"></td></tr>
2192
2193<tr>
2194<td valign=top>
21953
2196</td>
2197<td>
2198Smith, W. <br>
2199Class-based NewtonScript Programming<br>
2200PIE Developers magazine, Jan 1994<br>
2201</td>
2202</tr>
2203
2204<tr><td colspan=2 style="height:1em"></td></tr>
2205
2206<tr>
2207<td valign=top>
22084
2209</td>
2210<td>
2211Lieberman <br>
2212H. Concurrent Object-Oriented Programming in Act 1<br>
2213MIT AI Lab, 1987<br>
2214</td>
2215</tr>
2216
2217<tr><td colspan=2 style="height:1em"></td></tr>
2218
2219<tr>
2220<td valign=top>
22215
2222</td>
2223<td>
2224McCarthy, J et al. <br>
2225LISP I programmer's manual <br>
2226MIT Press, 1960 <br>
2227</td>
2228</tr>
2229
2230<tr><td colspan=2 style="height:1em"></td></tr>
2231
2232<tr>
2233<td valign=top>
22346
2235</td>
2236<td>
2237Ierusalimschy, R, et al. <br>   
2238Lua: an extensible extension language <br>
2239John Wiley & Sons, 1996 <br>
2240</td>
2241</tr>
2242</table>
2243
2244<a name="Appendix-License"></a>
2245<h3>ライセンス</h3>
2246
2247Copyright 2006, 2007, 2008 Steve Dekorte. All rights reserved.
2248<p>
2249Redistribution 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.
2250<p>
2251This 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 authors 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.
2252
2253</div>
2254<p><br><br><br>
Note: See TracBrowser for help on using the browser.