Differences From Artifact [a3c506d4caf580c9]:
- File
index.dd
- 2010-11-27 12:49:03 - part of checkin [a795c97dc3] on branch trunk - changed Let.init to Let.vdef. IT IS VERY DANGEROUS TO USE .init MEMBER NAME in D!!!!!!!! (user: kinaba) [annotate]
To Artifact [388d91fa67a7c403]:
- File
index.dd
- 2010-11-27 14:23:54 - part of checkin [005474ba5b] on branch trunk - changed: not to lift _|_ (user: kinaba) [annotate]
286 286
287 287
288 288
289 $(SECTION Layers, $(SECBODY 289 $(SECTION Layers, $(SECBODY
290 <p> 290 <p>
291 この言語の唯一の特徴的な部分は、「レイヤ」機能です。 291 この言語の唯一の特徴的な部分は、「レイヤ」機能です。
292 </p> 292 </p>
> 293 <p>
> 294 ひとつのコードに複数の「意味」を持たせるのが、レイヤ能の目的です。
> 295 </p>
293 $(DDOC_MEMBERS 296 $(DDOC_MEMBERS
294 $(SECTION Layers, $(SECBODY | 297 $(SECTION 概要, $(SECBODY
> 298 <p>
> 299 普通に Polemy のコードを動かすと、そのコードは「<tt>@value</tt> レイヤ」で動作します。
> 300 インタプリタで実験。
> 301 </p>
> 302 <pre>
> 303 $ bin/polemy
> 304 Welcome to Polemy 0.1.0
> 305 >> 1 + 2
> 306 3
> 307 </pre>
> 308 この、普通に、数字の 1 は数字の 1 として、2 は 2 として、足し算は足し算として実行するのが、
> 309 「<tt>@value</tt> レイヤ」です。
> 310 レイヤを明示的に指定するには、<tt>レイヤ名( ... )</tt> という構文を使います。
> 311 $(RED $(B レイヤ指定式)) と読んでいます。
> 312 つまり、さっきのコードは以下のようにも書けます。
> 313 <pre>
> 314 >> @value( 1 + 2 )
> 315 3
> 316 </pre>
> 317 他のレイヤで動かしてみましょう。適当に。「<tt>@hoge</tt> イヤ」で。
> 318 <pre>
> 319 >> @hoge( 3 )
> 320 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(138
> 321 [<REPL>:4:8] lift function for @hoge is not registered
> 322 </pre>
> 323 <p>
> 324 エラーになりました。Polemy のインタプリタは、起動時には<tt>@value</tt>
> 325 レイヤでのコードの意味しか知りません。<tt>@hoge</tt> レイでは <tt>3</tt>
> 326 というのがどんな意味なのか、わかりません!というエラが出ています。
> 327 </p>
> 328 <p>
> 329 これを教えてあげるためには、<tt>@hoge</tt> レイヤの $(RED $(B リフト関数)) というものを定義します。
> 330 </p>
> 331 <pre>
> 332 >> @@hoge = fun(x){ x*2 }
> 333 (function:1bdc5c0:1ba8580)
> 334 </pre>
> 335 <p>
> 336 <tt>@hoge</tt> レイヤでは、<tt>1</tt> というコードの意味は <tt>2</tt>、
> 337 <tt>2</tt> というコードの意味は <tt>4</tt>、…、という、全部2倍した意味」を持っていることにします。
> 338 「<tt>@ レイヤ名 = ...</tt>」 という構文を使います。
> 339 ここには、「<tt>@value</tt> レイヤでの値 <tt>x</tt> は <tt>@hoge</tt> レイヤではどういう意味になるか?」
> 340 を計算して返す関数を登録します。
> 341 これで、Polemy にも、<tt>@hoge</tt> レイヤの意味がわかるようなりました。
> 342 </p>
> 343 <pre>
> 344 >> @hoge( 3 )
> 345 6
> 346 </pre>
> 347 <p>
> 348 では、1+2 を <tt>@hoge</tt> レイヤで動かしてみましょう。
> 349 </p>
> 350 <pre>
> 351 >> @hoge( 1 + 2 )
> 352 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(466
> 353 [<REPL>:3:7] only @value layer can call native function: +
> 354 [<REPL>:3:7] +
> 355 </pre>
> 356 <p>
> 357 まだエラーですね。これは 実は、リフト関数は
> 358 </p>
> 359 <pre>
> 360 >> @hoge "+" = fun(x, y) {x}
> 361 </pre>
295 <pre> 362 <pre>
296 [Layers :: Overview] 363 [Layers :: Overview]
297 364
298 Polemy's runtime environment has many "layer"s. 365 Polemy's runtime environment has many "layer"s.
299 Usual execution run in the @value layer. 366 Usual execution run in the @value layer.
300 367
301 >> 1 + 2 368 >> 1 + 2
................................................................................................................................................................................
715 <br /> 782 <br />
716 783
717 $(SECTION データ型判定, $(SECBODY 784 $(SECTION データ型判定, $(SECBODY
718 $(TABLE 785 $(TABLE
719 $(TR $(TH _isint) $(TD (a)) $(TD a が整数なら 1、でなければ 0)) 786 $(TR $(TH _isint) $(TD (a)) $(TD a が整数なら 1、でなければ 0))
720 $(TR $(TH _isstr) $(TD (a)) $(TD a が文字列なら 1、でなければ 0)) 787 $(TR $(TH _isstr) $(TD (a)) $(TD a が文字列なら 1、でなければ 0))
721 $(TR $(TH _isfun) $(TD (a)) $(TD a が関数なら 1、でなければ 0)) 788 $(TR $(TH _isfun) $(TD (a)) $(TD a が関数なら 1、でなければ 0))
722 $(TR $(TH _istable) $(TD (a)) $(TD a がテーブルなら 1、でなければ 0)) | 789 $(TR $(TH _istbl) $(TD (a)) $(TD a がテーブルなら 1、でなければ 0))
723 $(TR $(TH _isundefined) $(TD (a)) $(TD a が未定義値なら 1、でなければ 0)) | 790 $(TR $(TH _isbot) $(TD (a)) $(TD a が未定義値なら 1、でなければ 0))
724 ) 791 )
725 )) 792 ))
726 ) 793 )
727 )) 794 ))
728 795
729 ) 796 )
730 Macros: 797 Macros:
731 TITLE=Polemy Reference Manual 798 TITLE=Polemy Reference Manual
732 DOCFILENAME=index.html 799 DOCFILENAME=index.html
733 SECTION=$(DDOC_DECL $(DDOC_PSYMBOL $1)) $(DDOC_DECL_DD $2) 800 SECTION=$(DDOC_DECL $(DDOC_PSYMBOL $1)) $(DDOC_DECL_DD $2)
734 SECBODY=$0 801 SECBODY=$0