| 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 | |
|---|
| 15 | var bodyStyle = { |
|---|
| 16 | width : '100%', |
|---|
| 17 | height : '100%', |
|---|
| 18 | padding : '0', |
|---|
| 19 | margin : '0', |
|---|
| 20 | overflow : 'hidden', |
|---|
| 21 | backgroundColor : '#000' |
|---|
| 22 | }; |
|---|
| 23 | |
|---|
| 24 | s6.css('html', bodyStyle); |
|---|
| 25 | s6.css('body', bodyStyle); |
|---|
| 26 | |
|---|
| 27 | var pr; |
|---|
| 28 | s6.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 |
|---|
| 106 | setInterval(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> |
|---|
| 298 | list("a", "b", "c") at(0) #=> "a" |
|---|
| 299 | list("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 なら括弧つけなければ実体がかえる |
|---|
| 314 | alertFunction = "foobar".alert; |
|---|
| 315 | </pre> |
|---|
| 316 | <pre> |
|---|
| 317 | # Io は括弧を省略できるので getSlot を使う |
|---|
| 318 | println := "foobar" getSlot("println") |
|---|
| 319 | # でも普通に書いたら実行されてしまうのでローカルに代入する意味はない |
|---|
| 320 | println #=> ローカルコンテキストオブジェクトを表示 |
|---|
| 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> |
|---|
| 332 | o := Object clone |
|---|
| 333 | o show := method(arg, |
|---|
| 334 | arg println |
|---|
| 335 | ) |
|---|
| 336 | o 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 に新しい手続きを代入 |
|---|
| 350 | foo := method("foo called" println) |
|---|
| 351 | foo("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 を書く |
|---|
| 367 | foo := method(arg, arg println) |
|---|
| 368 | foo("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 する |
|---|
| 383 | foo := method( call evalArgAt(0) println ) |
|---|
| 384 | foo("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> |
|---|
| 478 | foo := "foobar" # setSlot |
|---|
| 479 | foo ::= "foobar" # newSlot |
|---|
| 480 | foo = "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> |
|---|
| 493 | foo := "foobar" |
|---|
| 494 | setSlot("foo", "foobar") |
|---|
| 495 | foo #=> "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> |
|---|
| 508 | AnObj = Object clone do ( |
|---|
| 509 | attr ::= "init" |
|---|
| 510 | ) |
|---|
| 511 | AnObj attr #=> "init" |
|---|
| 512 | AnObj setAttr("foobar") |
|---|
| 513 | AnObj 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> |
|---|
| 526 | AnObj = Object clone do ( |
|---|
| 527 | a := "aaa" |
|---|
| 528 | ) |
|---|
| 529 | AnObj a = "bbb" # ok |
|---|
| 530 | AnObj 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> |
|---|
| 564 | if (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> |
|---|
| 581 | if(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> |
|---|
| 612 | class TrueClass; def ifTrue(&block) block.call end end |
|---|
| 613 | class FalseClass; def ifTrue(&block) end end |
|---|
| 614 | true.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> |
|---|
| 627 | if (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 | // 普通な感じ |
|---|
| 679 | list(1, 2, 3) map(i, i * i) #=> list(1, 4, 9) |
|---|
| 680 | |
|---|
| 681 | // ちょっと特殊 (部分適用のように見える) |
|---|
| 682 | list(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> |
|---|
| 694 | List mymap := method( |
|---|
| 695 | m := call message argAt(0); |
|---|
| 696 | map(i, i doMessage(m)) |
|---|
| 697 | ) |
|---|
| 698 | list(1, 2, 3) mymap(println) |
|---|
| 699 | list(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 | |
|---|
| 714 | def 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> |
|---|
| 741 | o := Object clone |
|---|
| 742 | o foo := method( call message next doInContext(self) ) |
|---|
| 743 | o 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> |
|---|
| 790 | Message fromString(""" "abc" =~ "a." """) code print |
|---|
| 791 | #=> "abc" =~ "a." |
|---|
| 792 | |
|---|
| 793 | OperatorTable addOperator("=~", 7) |
|---|
| 794 | Message 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> |
|---|
| 830 | foo := method(wait(3); 1) |
|---|
| 831 | a := foo #=> 3 秒まって1 |
|---|
| 832 | a := @foo #=> 即座に Future オブジェクトが返る |
|---|
| 833 | |
|---|
| 834 | a #=> ここで 3 秒まつ |
|---|
| 835 | a #=> もう待たないで即座に 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> |
|---|
| 848 | foo := method(wait(3); 1) |
|---|
| 849 | a := @foo #=> 即座に Future オブジェクトが返る |
|---|
| 850 | |
|---|
| 851 | yield; yield; yield #=> 他のコルーチンに処理をゆずる |
|---|
| 852 | |
|---|
| 853 | a #=> 即座に 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> |
|---|
| 865 | squareBrackets := getSlot("list") |
|---|
| 866 | block( |
|---|
| 867 | [1, 2, 3] foreach (i, i println; yield) |
|---|
| 868 | ) @@call #=> @@ は Future の変わりに nil を返す |
|---|
| 869 | block( |
|---|
| 870 | [1, 2, 3] foreach (i, i println; yield) |
|---|
| 871 | ) @@call |
|---|
| 872 | |
|---|
| 873 | # 確実に全部処理を終了させる |
|---|
| 874 | while(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> |
|---|
| 924 | o := Object clone |
|---|
| 925 | o forward := method( call message name println ) |
|---|
| 926 | o 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> |
|---|
| 938 | foo := method( "foobar" println ) |
|---|
| 939 | foo #=> 呼び出しされる |
|---|
| 940 | |
|---|
| 941 | bar := block( "foobar" println ) |
|---|
| 942 | bar #=> なにもおこらない |
|---|
| 943 | bar 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> |
|---|
| 956 | a := Object clone |
|---|
| 957 | a foo := method( self ) |
|---|
| 958 | (a foo == a) println #=> true |
|---|
| 959 | |
|---|
| 960 | b := Object clone |
|---|
| 961 | b 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> |
|---|
| 976 | b := block( |
|---|
| 977 | (self == Lobby) println #=> true |
|---|
| 978 | ) |
|---|
| 979 | b 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> |
|---|