@@ -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)) ) )) ) ))