Diff
Not logged in

Differences From Artifact [a3c506d4caf580c9]:

To Artifact [388d91fa67a7c403]:


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 &gt;&gt; 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 &gt;&gt; @value( 1 + 2 ) > 315 3 > 316 </pre> > 317 他のレイヤで動かしてみましょう。適当に。「<tt>@hoge</tt> イヤ」で。 > 318 <pre> > 319 &gt;&gt; @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 &gt;&gt; @@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 &gt;&gt; @hoge( 3 ) > 345 6 > 346 </pre> > 347 <p> > 348 では、1+2 を <tt>@hoge</tt> レイヤで動かしてみましょう。 > 349 </p> > 350 <pre> > 351 &gt;&gt; @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 &gt;&gt; @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