root/docs/cho45/20080529-io-language/index.html

Revision 12853, 25.6 kB (checked in by cho45, 7 months ago)

Io

  • Property svn:mime-type set to text/html
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5<meta http-equiv="Content-Style-Type" content="text/css; charset=utf-8" />
6<meta http-equiv="Content-Script-Type" content="text/javascript; charset=utf-8" />
7<meta name="author" content="cho45" />
8<link rev="made" href="mailto:cho45@lowreal.net" />
9<title>Io language 勉強会</title>
10<script type="text/javascript" src="s6.js"></script>
11<script type="text/javascript">
12// <![CDATA[
13// from http://amachang.art-code.org/ejohn/
14
15var bodyStyle = {
16        width           : '100%',
17        height          : '100%',
18        padding         : '0',
19        margin          : '0',
20        overflow        : 'hidden',
21        backgroundColor : '#000'
22};
23
24s6.css('html', bodyStyle);
25s6.css('body', bodyStyle);
26
27var pr;
28s6.attach(s6, 'ready', function ready() {
29        var html   = document.documentElement;
30        var height = html.offsetHeight;
31        var width  = html.offsetWidth;
32        var top    = 0;
33        var left   = 0;
34        var ratio  = 9/16;
35
36        if (height / width < ratio) {
37                var originalWidth = width;
38                width = height / ratio;
39                left = (originalWidth - width) / 2 + 'px';
40        }
41        else {
42                var originalHeight = height;
43                height = width * ratio;
44                top = (originalHeight - height) / 2 + 'px';
45        }
46
47        var result;
48        if (result = document.cookie.match(/page=(\d+)/)) {
49                var startIndex = +result[1];
50        }
51
52        pr = new s6.Presentation({
53                element    : document.body,
54                width      : width,
55                height     : height,
56                ratio      : ratio,
57                startIndex : startIndex
58        });
59        pr.style.left = left;
60        pr.style.top = top;
61        pr.start();
62
63        var indexNoOutline = false;
64
65        pr.funcPages.index.attachPage('click', function(i, element, wrapper) {
66                indexNoOutline = true;
67                setTimeout(function() {
68                        indexNoOutline =false
69                }, 1000);
70                wrapper.style.background = '';
71                pr.go(i);
72        });
73
74        pr.funcPages.index.attachPage('mouseover', function(i, element, wrapper) {
75                if (indexNoOutline) return;
76                wrapper.className += ' selected';
77        });
78       
79        pr.funcPages.index.attachPage('mouseout', function(i, element, wrapper) {
80                wrapper.className = 'wrapper';
81        });
82
83        try {
84                var isIframe = !(window.parent == window);
85        } catch(e) {
86                isIframe = true;
87        }
88
89        s6.attach(document,   'keypress Right', 'step', 0, pr);
90        s6.attach(document,   'keypress Left',  'prev', 0, pr);
91        s6.attach(document,   'keypress Up',    function() { pr.go('index') });
92        s6.attach(document,   'keypress Down',  'back', 0, pr);
93
94        s6.attach(document,   'keypress j',  'step', 0, pr);
95        s6.attach(document,   'keypress k',  'prev', 0, pr);
96        s6.attach(document,   'keypress h',  function() { pr.go('index') });
97        s6.attach(document,   'keypress l',  'back', 0, pr);
98
99
100        s6.css('.s6.dark .page', {
101                background: '#333 url(img/background.png) repeat-x'
102        })
103});
104
105// Test
106setInterval(function() {
107        document.cookie = 'page=' + pr.index;
108}, 1000);
109
110// ]]>
111</script>
112
113<style type="text/css">
114        .mini {
115                font-size: 70% !important;
116        }
117
118        em {
119                color: #dd0000;
120        }
121
122        pre em {
123                color: #be5b00;
124        }
125
126        .page dl {
127                font-size: 80% !important;
128                padding: 0 1em !important;
129        }
130
131        .page dl dt {
132                font-size: 80% !important;
133        }
134
135        .page dl dd {
136                font-size: 80% !important;
137                margin: 0 0 0 1em !important;
138        }
139</style>
140
141</head>
142
143<body>
144
145 <!-- ===================================================== -->
146
147<div class="page">
148        <h3>操作方法</h3>
149        <ul>
150                <li>j キー: 次のページへ</li>
151                <li>k キー: 前のページへ</li>
152                <li>h キー: 目次ページへ</li>
153                <li>l キー: 目次ページから戻る</li>
154                <li>目次ページでは ← → キーで一覧を移動し、クリックで選択します</li>
155        </ul>
156        <script type="text/javascript"> s6.page({ styles: { ul: { fontSize: '0.75em', marginTop: '2%' } } }) </script>
157</div>
158
159<div clase="page">
160        <h2>Io-language 勉強会</h2>
161        <p>cho45 (さとう) / <a href="http://www.lowreal.net/">www.lowreal.net</a></p>
162        <script type="text/javascript">
163                s6.page({ separator: 'fade', styles: { 'ul/li': { lineHeight: 1.7 } } })
164        </script>
165        <p>ご注意:Io は発展途上でちょくちょく挙動が変わります。(Io 20080120)</p>
166</div>
167
168<div clase="page">
169        <h2>Agenda</h2>
170        <ul>
171                <li>Io の雰囲気</li>
172                <li>Io の超基本的な文法</li>
173                <li>Io の Message オブジェクト</li>
174                <li>非同期メッセージング</li>
175        </ul>
176        <script type="text/javascript">
177                s6.page({ separator: 'fade', styles: {} })
178        </script>
179</div>
180
181<div clase="page">
182        <h2>Agenda</h2>
183        <p>Ruby, Perl などとの違いを中心にお話ししようと思います</p>
184        <script type="text/javascript">
185                s6.page({ separator: 'fade', styles: {} })
186        </script>
187</div>
188
189<div clase="page">
190        <h2>Io の立ち位置と雰囲気</h2>
191        <ul>
192                <li>プロトタイプベース OO (Self?)</li>
193                <li>純粋な「メッセージング」による制御 (Smalltalk?)</li>
194                <li>埋め込み用途 (Lua?)</li>
195                <li>Lisp 的な純粋さと、「ふつう」の言語、両方の特徴をもつ文法</li>
196        </ul>
197        <script type="text/javascript">
198                s6.page({ separator: 'fade', styles: {
199                'h2' : { fontSize: "50%", margin: "0.5em" }
200                } })
201        </script>
202</div>
203
204<div clase="page">
205        <h2>例文</h2>
206        <ul>
207                <li>eio.io (割と普通の実装)</li>
208        </ul>
209        <script type="text/javascript">
210                s6.page({ separator: 'fade', styles: {
211                'h2' : { fontSize: "50%", margin: "0.5em" }
212                } })
213        </script>
214</div>
215
216<div clase="page">
217        <h2>Io が持っているもの</h2>
218        <ul>
219                <li>なんかすごいメタプログラミング</li>
220                <li>非同期メソッド呼び出し<br />(透過的でかっこいい)</li>
221                <li>例外 (JS と同じ感じ) → 省略</li>
222                <li>DLL機構 (拡張ライブラリ)</li>
223        </ul>
224        <script type="text/javascript">
225                s6.page({ separator: 'fade', styles: {
226                'h2' : { fontSize: "50%", margin: "0.5em" }
227                } })
228        </script>
229</div>
230
231<div clase="page">
232        <h2>Io が持っていないもの</h2>
233        <ul>
234                <li>正規表現リテラル (Regex はあるけど使いにくい)</li>
235                <li>リストのリテラル (つくればある)</li>
236                <li>仕様の安定性</li>
237                <li>などなど</li>
238        </ul>
239        <script type="text/javascript">
240                s6.page({ separator: 'fade', styles: {
241                'h2' : { fontSize: "50%", margin: "0.5em" }
242                } })
243        </script>
244</div>
245
246<div clase="page">
247        <h2>Io の「メッセージング」</h2>
248        <p>メッセージングは OOP での一番重要なとこ</p>
249        <ul>
250                <li>これさえあればなんでもOK!</li>
251                <li>Io では演算子もそのままのメッセージ</li>
252                <li>if や while, for もメッセージ</li>
253        </ul>
254        <script type="text/javascript">
255                s6.page({ separator: 'fade', styles: {
256                'h2' : { fontSize: "50%", margin: "0.5em" }
257                } })
258        </script>
259</div>
260
261<div clase="page">
262        <h2>Io の「オブジェクト」</h2>
263        <p>JS と同じ感じのハッシュっぽいもの</p>
264        <ul>
265                <li>名前と値のセットを「スロット」という</li>
266                <li>他のオブジェクトから新しいオブジェクトを生成<br/>→ プロトタイピング</li>
267                <li>↑JS と違って関数である必要はない</li>
268        </ul>
269        <script type="text/javascript">
270                s6.page({ separator: 'fade', styles: {
271                'h2' : { fontSize: "50%", margin: "0.5em" }
272                } })
273        </script>
274</div>
275
276<div clase="page">
277        <h2>Io の超基本的な文法 (メソッド呼び出し)</h2>
278        <pre>
279// foobar を表示する Io のコード
280"foobar" println
281</pre>
282
283        <pre>
284// JS っぽい疑似コード
285"foobar".alert();
286</pre>
287        <p>他の言語だとドットやアローがあるところはスペースになっている (Self 風)</p>
288        <script type="text/javascript">
289                s6.page({ separator: 'fade', styles: {
290                'h2' : { fontSize: "50%", margin: "0.5em" }
291                } })
292        </script>
293
294</div>
295<div clase="page">
296        <h2>Io の超基本的な文法 (メソッド呼び出し)</h2>
297        <pre>
298list("a", "b", "c") at(0) #=> "a"
299list("a", "b", "c") println
300</pre>
301        <p>引数を渡したいときは括弧が必須</p>
302        <p>引数をとらないメソッドは括弧を省略可</p>
303        <script type="text/javascript">
304                s6.page({ separator: 'fade', styles: {
305                'h2' : { fontSize: "50%", margin: "0.5em" }
306                } })
307        </script>
308</div>
309
310<div clase="page">
311        <h2>(println の実体)</h2>
312        <pre>
313// JS なら括弧つけなければ実体がかえる
314alertFunction = "foobar".alert;
315</pre>
316        <pre>
317# Io は括弧を省略できるので getSlot を使う
318println := "foobar" getSlot("println")
319# でも普通に書いたら実行されてしまうのでローカルに代入する意味はない
320println #=> ローカルコンテキストオブジェクトを表示
321</pre>
322        <script type="text/javascript">
323                s6.page({ separator: 'fade', styles: {
324                'h2' : { fontSize: "50%", margin: "0.5em" }
325                } })
326        </script>
327</div>
328
329<div clase="page">
330        <h2>メソッドの定義</h2>
331        <pre>
332o := Object clone
333o show := method(arg,
334        arg println
335)
336o show("shown")
337</pre>
338        <p>method を対象オブジェクトにセットする</p>
339        <script type="text/javascript">
340                s6.page({ separator: 'fade', styles: {
341                'h2' : { fontSize: "50%", margin: "0.5em" }
342                } })
343        </script>
344</div>
345
346<div clase="page">
347        <h2>引数の取扱</h2>
348        <pre>
349# foo に新しい手続きを代入
350foo := method("foo called" println)
351foo("not shown" println)
352# foo callled のみ表示される
353</pre>
354        <p>重要:引数は基本的には全く評価されない</p>
355        <p>全部ブロック渡し・関数渡しみたいなもの</p>
356        <script type="text/javascript">
357                s6.page({ separator: 'fade', styles: {
358                'h2' : { fontSize: "50%", margin: "0.5em" }
359                } })
360        </script>
361</div>
362
363<div clase="page">
364        <h2>引数の取扱 (評価させるには)</h2>
365        <pre>
366# method 定義時に仮引数 arg を書く
367foo := method(arg, arg println)
368foo("shown" println)
369# shown が二回表示される
370</pre>
371        <p>仮引数 (arg) を書けば自動的にそれは評価される</p>
372        <script type="text/javascript">
373                s6.page({ separator: 'fade', styles: {
374                'h2' : { fontSize: "50%", margin: "0.5em" }
375                } })
376        </script>
377</div>
378
379<div clase="page">
380        <h2>引数の取扱 (評価させるには)</h2>
381        <pre>
382# 明示的に引数を eval する
383foo := method( call evalArgAt(0) println )
384foo("shown" println)
385# shown が二回表示される
386</pre>
387        <p>call というスロットは特別重要</p>
388        <script type="text/javascript">
389                s6.page({ separator: 'fade', styles: {
390                'h2' : { fontSize: "50%", margin: "0.5em" }
391                } })
392        </script>
393</div>
394
395<div clase="page">
396        <h2>呼び出し (JS とほぼ同じ)</h2>
397        <ol>
398                <li>ローカル変数用のオブジェクトが作られる<br />(アクティベーションオブジェクト)</li>
399                <li>call, self などのスロットを初期化する<br />(arguments みたいなのを初期化する)</li>
400                <li>本体が実行される</li>
401        </ol>
402        <script type="text/javascript">
403                s6.page({ separator: 'fade',
404                        styles: {
405                                'h2' : { fontSize: "50%", margin: "0.5em" },
406                                'ol/li' : { display: 'none', position: "absolute", fontSize: "70%", textAlign: "center", margin: "3em auto 0", width: "100%" }
407                        },
408                        actions: [
409                                [
410                                        ['ol/li[0]', 'fade in', 0.3]
411                                ],
412                                [
413                                        ['ol/li[0]', 'fade out', 0.3],
414                                        ['ol/li[1]', 'fade in', 0.3]
415                                ],
416                                [
417                                        ['ol/li[1]', 'fade out', 0.3],
418                                        ['ol/li[2]', 'fade in', 0.3]
419                                ],
420                        ]
421                })
422        </script>
423</div>
424
425<div clase="page">
426        <h2>call</h2>
427        <ul>
428                <li>呼び出しされるたびにローカルコンテキストに作られる</li>
429                <li>Call オブジェクトのインスタンス</li>
430                <li>呼び出しもとの情報を保持</li>
431        </ul>
432        <script type="text/javascript">
433                s6.page({ separator: 'fade', styles: {
434                'h2' : { fontSize: "50%", margin: "0.5em" }
435                } })
436        </script>
437</div>
438
439<div clase="page">
440        <h2>call のよくつかうもの</h2>
441        <dl>
442                <dt>call sender</dt>
443                <dd>呼び出しもとのローカルコンテキスト</dd>
444                <dt>call message</dt>
445                <dd>呼び出したメッセージ</dd>
446        </dl>
447        <script type="text/javascript">
448                s6.page({ separator: 'fade', styles: {
449                'h2' : { fontSize: "50%", margin: "0.5em" }
450                } })
451        </script>
452</div>
453
454<div clase="page">
455        <p>代入</p>
456        <script type="text/javascript">
457                s6.page({ separator: 'fade',
458                        styles: {
459                                'p': {
460                                        position        : 'absolute',
461                                        backgroundColor : '#000',
462                                        margin          : '0',
463                                        padding         : '25% 0',
464                                        width           : '100%',
465                                        height          : '100%',
466                                        textAlign       : 'center'
467                                }
468                        },
469                        actions : [
470                        ]
471                })
472        </script>
473</div>
474
475<div clase="page">
476        <h2>代入</h2>
477        <pre>
478foo :=  "foobar" # setSlot
479foo ::= "foobar" # newSlot
480foo =   "foobar" # updateSlot
481</pre>
482        <p>代入はオブジェクトのスロットを操作する行為</p>
483        <script type="text/javascript">
484                s6.page({ separator: 'fade', styles: {
485                'h2' : { fontSize: "50%", margin: "0.5em" }
486                } })
487        </script>
488</div>
489
490<div clase="page">
491        <h2>代入 setSlot</h2>
492        <pre>
493foo := "foobar"
494setSlot("foo", "foobar")
495foo #=> "foobar"
496</pre>
497        <p>setSlot はレシーバに引数の名前と値でスロットをつくる</p>
498        <script type="text/javascript">
499                s6.page({ separator: 'fade', styles: {
500                'h2' : { fontSize: "50%", margin: "0.5em" }
501                } })
502        </script>
503</div>
504
505<div clase="page">
506        <h2>代入 newSlot</h2>
507        <pre>
508AnObj = Object clone do (
509        attr ::= "init"
510)
511AnObj attr #=> "init"
512AnObj setAttr("foobar")
513AnObj attr #=> "foobar"
514</pre>
515        <p>newSlot は setSlot + アクセサメソッド定義</p>
516        <script type="text/javascript">
517                s6.page({ separator: 'fade', styles: {
518                'h2' : { fontSize: "50%", margin: "0.5em" }
519                } })
520        </script>
521</div>
522
523<div clase="page">
524        <h2>代入 updateSlot</h2>
525        <pre>
526AnObj = Object clone do (
527        a := "aaa"
528)
529AnObj a = "bbb" # ok
530AnObj b = "bbb" # ng
531</pre>
532        <p>updateSlot は proto chain をたどってセット、なければ例外</p>
533        <script type="text/javascript">
534                s6.page({ separator: 'fade', styles: {
535                'h2' : { fontSize: "50%", margin: "0.5em" }
536                } })
537        </script>
538</div>
539
540<div clase="page">
541        <p>制御構文の例を if で</p>
542        <script type="text/javascript">
543                s6.page({ separator: 'fade',
544                        styles: {
545                                'p': {
546                                        position        : 'absolute',
547                                        backgroundColor : '#000',
548                                        margin          : '0',
549                                        padding         : '25% 0',
550                                        width           : '100%',
551                                        height          : '100%',
552                                        textAlign       : 'center'
553                                }
554                        },
555                        actions : [
556                        ]
557                })
558        </script>
559</div>
560
561<div clase="page">
562        <h2>if 1</h2>
563        <pre>
564if (a > 1) then (
565        "foo" println
566) else (
567        "bar" println
568)
569</pre>
570        <p>実はメソッドチェイン</p>
571        <script type="text/javascript">
572                s6.page({ separator: 'fade', styles: {
573                'h2' : { fontsize: "50%", margin: "0.5em" }
574                } })
575        </script>
576</div>
577
578<div clase="page">
579        <h2>if 1 (JS 等価コード)</h2>
580        <pre>
581if(a > 1).then(function () {
582        alert("foo");
583}).else(function () {
584        alert("bar");
585})
586</pre>
587        <script type="text/javascript">
588                s6.page({ separator: 'fade', styles: {
589                'h2' : { fontSize: "50%", margin: "0.5em" }
590                } })
591        </script>
592</div>
593
594<div clase="page">
595        <h2>if 2</h2>
596        <pre>
597(a > 1) ifTrue( "true" println)
598</pre>
599        <p>単にメソッドを呼んでるにすぎない</p>
600        <p>false は ifTrue の引数を評価しない。true ならする、の違いで分岐する</p>
601        <script type="text/javascript">
602                s6.page({ separator: 'fade', styles: {
603                'h2' : { fontSize: "50%", margin: "0.5em" }
604                } })
605        </script>
606</div>
607
608
609<div clase="page">
610        <h2>if 2 (Ruby 等価コード)</h2>
611        <pre>
612class TrueClass; def ifTrue(&amp;block) block.call end end
613class FalseClass; def ifTrue(&amp;block) end end
614true.ifTrue { p "true" }
615(a > 1).ifTrue { p "true" }
616</pre>
617        <script type="text/javascript">
618                s6.page({ separator: 'fade', styles: {
619                'h2' : { fontSize: "50%", margin: "0.5em" }
620                } })
621        </script>
622</div>
623
624<div clase="page">
625        <h2>if 3</h2>
626        <pre>
627if (a > 1, "true", "false")
628</pre>
629        <p>一番高速、返り値が評価したメッセージの値になる</p>
630        <p>たぶん一番よく使う。ちょっと読みにくい。</p>
631        <script type="text/javascript">
632                s6.page({ separator: 'fade', styles: {
633                'h2' : { fontSize: "50%", margin: "0.5em" }
634                } })
635        </script>
636</div>
637
638<div clase="page">
639        <p>Message オブジェクト</p>
640        <script type="text/javascript">
641                s6.page({ separator: 'fade',
642                        styles: {
643                                'p': {
644                                        position        : 'absolute',
645                                        backgroundColor : '#000',
646                                        margin          : '0',
647                                        padding         : '25% 0',
648                                        width           : '100%',
649                                        height          : '100%',
650                                        textAlign       : 'center'
651                                }
652                        },
653                        actions : [
654                        ]
655                })
656        </script>
657</div>
658
659<div clase="page">
660        <h2>Io の Message とは</h2>
661        <ul>
662                <li>メッセージのオブジェクト</li>
663                <li>call message や call message argAt(n) でとれる</li>
664                <li>文字列から作ることもできる</li>
665                <li>おおざっぱにいうと構文木が扱える仕組み</li>
666        </ul>
667        <script type="text/javascript">
668                s6.page({ separator: 'fade', styles: {
669                'h2' : { fontSize: "50%", margin: "0.5em" }
670                } })
671        </script>
672</div>
673
674
675<div clase="page">
676        <h2>こんなことできる</h2>
677        <pre>
678// 普通な感じ
679list(1, 2, 3) map(i, i * i) #=> list(1, 4, 9)
680
681// ちょっと特殊 (部分適用のように見える)
682list(1, 2, 3) map(*3)       #=> list(3, 6, 9)
683</pre>
684        <script type="text/javascript">
685                s6.page({ separator: 'fade', styles: {
686                'h2' : { fontSize: "50%", margin: "0.5em" }
687                } })
688        </script>
689</div>
690
691<div clase="page">
692        <h2>map(*3) の原理</h2>
693        <pre>
694List mymap := method(
695    m := call message argAt(0);
696    map(i, i doMessage(m))
697)
698list(1, 2, 3) mymap(println)
699list(1, 2, 3) mymap(*(3))
700</pre>
701        <p>対象オブジェクトに引数にあたえられたメッセージを送っている</p>
702        <script type="text/javascript">
703                s6.page({ separator: 'fade', styles: {
704                'h2' : { fontSize: "50%", margin: "0.5em" }
705                } })
706        </script>
707</div>
708
709<div clase="page">
710        <h2>こんなことできる</h2>
711        <pre>
712# foo := method(mes, "foo #{mes}" interpolate println )
713
714def foo (mes) {
715        "foo #{mes}" interpolate println
716}
717# ↑ もはや Io に見えない。def が function ならまんま JS
718</pre>
719<p><a href="http://subtech.g.hatena.ne.jp/cho45/20080513/1210686029">Io で def</a></p>
720        <script type="text/javascript">
721                s6.page({ separator: 'fade', styles: {
722                'h2' : { fontSize: "50%", margin: "0.5em" }
723                } })
724        </script>
725</div>
726
727<div clase="page">
728        <h2>括弧の省略</h2>
729        <p>引数がある場合は括弧が省略できないと書きましたが、自力で call message をパースすれば省略させられます。</p>
730        <p><a href="http://github.com/cho45/ioke/tree/master">Ioke</a> (Io で Rake っぽいの)</p>
731        <script type="text/javascript">
732                s6.page({ separator: 'fade', styles: {
733                'h2' : { fontSize: "50%", margin: "0.5em" }
734                } })
735        </script>
736</div>
737
738<div clase="page">
739        <h2>Message の罠</h2>
740        <pre>
741o := Object clone
742o foo := method( call message next doInContext(self) )
743o foo; "aaa" println; "aaa" println # ← call message の行
744
745# aaa は4回出力される
746# Message はチェインしている
747</pre>
748        <p class="mini">特定の一つのメッセージだけを実行したいなら setNext(nil) する必要がある</p>
749        <script type="text/javascript">
750                s6.page({ separator: 'fade', styles: {
751                'h2' : { fontSize: "50%", margin: "0.5em" }
752                } })
753        </script>
754</div>
755
756<div clase="page">
757        <p>パーサーの挙動を変える</p>
758        <script type="text/javascript">
759                s6.page({ separator: 'fade',
760                        styles: {
761                                'p': {
762                                        position        : 'absolute',
763                                        backgroundColor : '#000',
764                                        margin          : '0',
765                                        padding         : '25% 0',
766                                        width           : '100%',
767                                        height          : '100%',
768                                        textAlign       : 'center'
769                                }
770                        },
771                        actions : [
772                        ]
773                })
774        </script>
775</div>
776
777<div clase="page">
778        <h2>演算子の定義</h2>
779        <p>Io はパーサの挙動を一部変えれます。</p>
780        <script type="text/javascript">
781                s6.page({ separator: 'fade', styles: {
782                'h2' : { fontSize: "50%", margin: "0.5em" }
783                } })
784        </script>
785</div>
786
787<div clase="page">
788        <h2>演算子の登録</h2>
789        <pre>
790Message fromString(""" "abc" =~ "a." """) code print
791#=> "abc" =~ "a."
792
793OperatorTable addOperator("=~", 7)
794Message fromString(""" "abc" =~ "a." """) code print
795#=> "abc" =~("a.")
796# ↑ "a." が =~ の引数になっている
797</pre>
798        <p class="mini">次のパースから反映される</p>
799        <script type="text/javascript">
800                s6.page({ separator: 'fade', styles: {
801                'h2' : { fontSize: "50%", margin: "0.5em" }
802                } })
803        </script>
804</div>
805
806<div clase="page">
807        <p>非同期</p>
808        <script type="text/javascript">
809                s6.page({ separator: 'fade',
810                        styles: {
811                                'p': {
812                                        position        : 'absolute',
813                                        backgroundColor : '#000',
814                                        margin          : '0',
815                                        padding         : '25% 0',
816                                        width           : '100%',
817                                        height          : '100%',
818                                        textAlign       : 'center'
819                                }
820                        },
821                        actions : [
822                        ]
823                })
824        </script>
825</div>
826
827<div clase="page">
828        <h2>非同期 (demo)</h2>
829        <pre>
830foo := method(wait(3); 1)
831a := foo  #=> 3 秒まって1
832a := @foo #=> 即座に Future オブジェクトが返る
833
834a #=> ここで 3 秒まつ
835a #=> もう待たないで即座に 1 が返る
836</pre>
837        <p>非同期指定されたメッセージはキューに入る。</p>
838        <script type="text/javascript">
839                s6.page({ separator: 'fade', styles: {
840                'h2' : { fontSize: "50%", margin: "0.5em" }
841                } })
842        </script>
843</div>
844
845<div clase="page">
846        <h2>非同期</h2>
847        <pre>
848foo := method(wait(3); 1)
849a := @foo #=> 即座に Future オブジェクトが返る
850
851yield; yield; yield #=> 他のコルーチンに処理をゆずる
852
853a #=> 即座に 1 が返る
854</pre>
855        <script type="text/javascript">
856                s6.page({ separator: 'fade', styles: {
857                'h2' : { fontSize: "50%", margin: "0.5em" }
858                } })
859        </script>
860</div>
861
862<div clase="page">
863        <h2>非同期</h2>
864        <pre>
865squareBrackets := getSlot("list")
866block(
867        [1, 2, 3] foreach (i, i println; yield)
868) @@call #=> @@ は Future の変わりに nil を返す
869block(
870        [1, 2, 3] foreach (i, i println; yield)
871) @@call
872
873# 確実に全部処理を終了させる
874while(Scheduler yieldingCoros size > 1, yield)
875</pre>
876        <script type="text/javascript">
877                s6.page({ separator: 'fade', styles: {
878                'h2' : { fontSize: "50%", margin: "0.5em" }
879                } })
880        </script>
881</div>
882
883
884<div clase="page">
885        <h2>非同期</h2>
886        <ul class="mini">
887                <li>アクターモデルというらしい<br />(オブジェクト + コルーチン)</li>
888                <li>yield はキューに現在のコルーチンを入れ、次のキューを実行する</li>
889                <li>Future は透過的な Deferred</li>
890                <li>Future はアクセスすると処理がうつるので @@ をつかうと便利なときがある</li>
891        </ul>
892        <script type="text/javascript">
893                s6.page({ separator: 'fade', styles: {
894                'h2' : { fontSize: "50%", margin: "0.5em" }
895                } })
896        </script>
897</div>
898
899
900<div clase="page">
901        <p>以下若干細かいところ</p>
902        <script type="text/javascript">
903                s6.page({ separator: 'fade',
904                        styles: {
905                                'p': {
906                                        position        : 'absolute',
907                                        backgroundColor : '#000',
908                                        margin          : '0',
909                                        padding         : '25% 0',
910                                        width           : '100%',
911                                        height          : '100%',
912                                        textAlign       : 'center'
913                                }
914                        },
915                        actions : [
916                        ]
917                })
918        </script>
919</div>
920
921<div clase="page">
922        <h2>method_missing</h2>
923        <pre>
924o := Object clone
925o forward := method( call message name println )
926o foobar #=> foobar が表示される
927</pre>
928        <script type="text/javascript">
929                s6.page({ separator: 'fade', styles: {
930                'h2' : { fontSize: "50%", margin: "0.5em" }
931                } })
932        </script>
933</div>
934
935<div clase="page">
936        <h2>ブロックとメソッド</h2>
937        <pre>
938foo := method( "foobar" println )
939foo #=> 呼び出しされる
940
941bar := block( "foobar" println )
942bar #=> なにもおこらない
943bar call #=> call が必要
944</pre>
945        <p>あとは self の違い</p>
946        <script type="text/javascript">
947                s6.page({ separator: 'fade', styles: {
948                'h2' : { fontSize: "50%", margin: "0.5em" }
949                } })
950        </script>
951</div>
952
953<div clase="page">
954        <h2>メソッド</h2>
955        <pre>
956a := Object clone
957a foo := method( self )
958(a foo == a) println #=> true
959
960b := Object clone
961b foo := a getSlot("foo")
962(b foo == b) println #=> true
963
964# method の self は呼びだし時に決定するレシーバ
965</pre>
966        <script type="text/javascript">
967                s6.page({ separator: 'fade', styles: {
968                'h2' : { fontSize: "50%", margin: "0.5em" }
969                } })
970        </script>
971</div>
972
973<div clase="page">
974        <h2>ブロック</h2>
975        <pre>
976b := block(
977        (self == Lobby) println #=> true
978)
979b call
980#=> Lobby は JS でいうところの window
981(Lobby Lobby == Lobby)
982
983# block の self は外側のローカル変数オブジェクトと同じ
984</pre>
985        <script type="text/javascript">
986                s6.page({ separator: 'fade', styles: {
987                'h2' : { fontSize: "50%", margin: "0.5em" }
988                } })
989        </script>
990</div>
991
992<div clase="page">
993        <h2>"" リテラル (Sequence)</h2>
994        <pre>
995"foobar" replaceSeq("foo", "aaa")
996#=> Exception: 'replaceSeq' cannot be called on an immutable Sequence
997
998"foobar" asMutable replaceSeq("foo", "aaa")
999#=> aaabar
1000</pre>
1001        <p>"" は Symbol を作る。</p>
1002        <script type="text/javascript">
1003                s6.page({ separator: 'fade', styles: {
1004                'h2' : { fontSize: "50%", margin: "0.5em" }
1005                } })
1006        </script>
1007</div>
1008
1009<div clase="page">
1010        <h2>最後に</h2>
1011        <ul>
1012                <li>Io のエントリ書くときは io language で!</li>
1013                <li>実装が綺麗なので読んでみるといいかも (全部読んでないです)</li>
1014                <li>オレオレ言語設計用のメタ言語っぽい感じも</li>
1015                <li>g:generation1986:anatoo さんがエントリ書いてる</li>
1016        </ul>
1017        <script type="text/javascript">
1018                s6.page({ separator: 'fade', styles: {
1019                'h2' : { fontSize: "50%", margin: "0.5em" }
1020                } })
1021        </script>
1022</div>
1023
1024<div clase="page">
1025        <div class='photo'>
1026                <p>
1027                        <img src="img/last.jpg" width="332" height="500" alt="" />
1028                </p>
1029                <p>That's all! Thank you.</p>
1030        </div>
1031        <script type="text/javascript">
1032                s6.page({ separator: 'fade',
1033                        styles: {
1034                                'p': {
1035                                        position        : 'absolute',
1036                                        backgroundColor : '',
1037                                        margin          : '0',
1038                                        padding         : '25% 0',
1039                                        width           : '100%',
1040                                        height          : '100%',
1041                                        textAlign       : 'center'
1042                                },
1043                                'div[0]': {
1044                                        position        : 'absolute',
1045                                        backgroundColor : '#000',
1046                                        margin          : 0,
1047                                        padding         : 0,
1048                                        width           : '100%',
1049                                        height          : '100%',
1050                                        textAlign       : 'center'
1051                                },
1052                        },
1053                        actions : [
1054                        ]
1055                })
1056        </script>
1057</div>
1058
1059
1060</body>
1061</html>
Note: See TracBrowser for help on using the browser.