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 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 + >> 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 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