Diff
Not logged in

Differences From Artifact [a3c506d4caf580c9]:

To Artifact [388d91fa67a7c403]:


286 286 287 287 288 288 289 289 $(SECTION Layers, $(SECBODY 290 290 <p> 291 291 この言語の唯一の特徴的な部分は、「レイヤ」機能です。 292 292 </p> 293 +<p> 294 +ひとつのコードに複数の「意味」を持たせるのが、レイヤ機能の目的です。 295 +</p> 293 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 362 <pre> 296 363 [Layers :: Overview] 297 364 298 365 Polemy's runtime environment has many "layer"s. 299 366 Usual execution run in the @value layer. 300 367 301 368 >> 1 + 2 ................................................................................ 715 782 <br /> 716 783 717 784 $(SECTION データ型判定, $(SECBODY 718 785 $(TABLE 719 786 $(TR $(TH _isint) $(TD (a)) $(TD a が整数なら 1、でなければ 0)) 720 787 $(TR $(TH _isstr) $(TD (a)) $(TD a が文字列なら 1、でなければ 0)) 721 788 $(TR $(TH _isfun) $(TD (a)) $(TD a が関数なら 1、でなければ 0)) 722 - $(TR $(TH _istable) $(TD (a)) $(TD a がテーブルなら 1、でなければ 0)) 723 - $(TR $(TH _isundefined) $(TD (a)) $(TD a が未定義値なら 1、でなければ 0)) 789 + $(TR $(TH _istbl) $(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 797 Macros: 731 798 TITLE=Polemy Reference Manual 732 799 DOCFILENAME=index.html 733 800 SECTION=$(DDOC_DECL $(DDOC_PSYMBOL $1)) $(DDOC_DECL_DD $2) 734 801 SECBODY=$0