@@ -289,10 +289,77 @@ $(SECTION Layers, $(SECBODY

この言語の唯一の特徴的な部分は、「レイヤ」機能です。

+

+ひとつのコードに複数の「意味」を持たせるのが、レイヤ機能の目的です。 +

$(DDOC_MEMBERS -$(SECTION Layers, $(SECBODY +$(SECTION 概要, $(SECBODY +

+普通に Polemy のコードを動かすと、そのコードは「@value レイヤ」で動作します。 +インタプリタで実験。 +

+
+    $ bin/polemy
+    Welcome to Polemy 0.1.0
+    >> 1 + 2
+    3
+
+この、普通に、数字の 1 は数字の 1 として、2 は 2 として、足し算は足し算として実行するのが、 +「@value レイヤ」です。 +レイヤを明示的に指定するには、レイヤ名( ... ) という構文を使います。 +$(RED $(B レイヤ指定式)) と読んでいます。 +つまり、さっきのコードは以下のようにも書けます。 +
+    >> @value( 1 + 2 )
+    3
+
+他のレイヤで動かしてみましょう。適当に。「@hoge レイヤ」で。 +
+    >> @hoge( 3 )
+    polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(138):
+    [:4:8] lift function for @hoge is not registered
+
+

+エラーになりました。Polemy のインタプリタは、起動時には、@value +レイヤでのコードの意味しか知りません。@hoge レイヤでは 3 +というのがどんな意味なのか、わかりません!というエラーが出ています。 +

+

+これを教えてあげるためには、@hoge レイヤの $(RED $(B リフト関数)) というものを定義します。 +

+
+    >> @@hoge = fun(x){ x*2 }
+    (function:1bdc5c0:1ba8580)
+
+

+@hoge レイヤでは、1 というコードの意味は 2、 +2 というコードの意味は 4、…、という、全部「2倍した意味」を持っていることにします。 +「@ レイヤ名 = ...」 という構文を使います。 +ここには、「@value レイヤでの値 x@hoge レイヤではどういう意味になるか?」 +を計算して返す関数を登録します。 +これで、Polemy にも、@hoge レイヤの意味がわかるようになりました。 +

+
+    >> @hoge( 3 )
+    6
+
+

+では、1+2 を @hoge レイヤで動かしてみましょう。 +

+
+    >> @hoge( 1 + 2 )
+    polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(466):
+    [:3:7] only @value layer can call native function: +
+    [:3:7] +
+
+

+まだエラーですね。これは 実は、リフト関数は +

+
+    >> @hoge "+" = fun(x, y) {x}
+
 [Layers :: Overview]
 
   Polemy's runtime environment has many "layer"s.
@@ -718,10 +785,10 @@
   $(TABLE
     $(TR $(TH _isint) $(TD (a)) $(TD a が整数なら 1、でなければ 0))
     $(TR $(TH _isstr) $(TD (a)) $(TD a が文字列なら 1、でなければ 0))
     $(TR $(TH _isfun) $(TD (a)) $(TD a が関数なら 1、でなければ 0))
-    $(TR $(TH _istable) $(TD (a)) $(TD a がテーブルなら 1、でなければ 0))
-    $(TR $(TH _isundefined) $(TD (a)) $(TD a が未定義値なら 1、でなければ 0))
+    $(TR $(TH _istbl) $(TD (a)) $(TD a がテーブルなら 1、でなければ 0))
+    $(TR $(TH _isbot) $(TD (a)) $(TD a が未定義値なら 1、でなければ 0))
   )
 ))
 )
 ))