Diff
Not logged in

Differences From Artifact [a25f52da129efe47]:

To Artifact [8335b49cb250b861]:


431 <pre> 431 <pre> 432 &gt;&gt; @value( 1 + 2 ) 432 &gt;&gt; @value( 1 + 2 ) 433 3 433 3 434 </pre> 434 </pre> 435 他のレイヤで動かしてみましょう。適当に。「<tt>@hoge</tt> レイヤ」で。 435 他のレイヤで動かしてみましょう。適当に。「<tt>@hoge</tt> レイヤ」で。 436 <pre> 436 <pre> 437 &gt;&gt; @hoge( 3 ) 437 &gt;&gt; @hoge( 3 ) 438 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(138 | 438 polemy.failure.RuntimeException@polemy\eval.d(138): 439 [<REPL>:4:8] lift function for @hoge is not registered 439 [<REPL>:4:8] lift function for @hoge is not registered 440 </pre> 440 </pre> 441 <p> 441 <p> 442 エラーになりました。Polemy のインタプリタは、起動時には、<tt>@value</tt> 442 エラーになりました。Polemy のインタプリタは、起動時には、<tt>@value</tt> 443 レイヤでのコードの意味しか知りません。<tt>@hoge</tt> レイヤでは <tt>3</tt> 443 レイヤでのコードの意味しか知りません。<tt>@hoge</tt> レイヤでは <tt>3</tt> 444 というのがどんな意味なのか、わかりません!というエラーが出ています。 444 というのがどんな意味なのか、わかりません!というエラーが出ています。 445 </p> 445 </p> ................................................................................................................................................................................ 463 6 463 6 464 </pre> 464 </pre> 465 <p> 465 <p> 466 では、1+2 を <tt>@hoge</tt> レイヤで動かしてみましょう。 466 では、1+2 を <tt>@hoge</tt> レイヤで動かしてみましょう。 467 </p> 467 </p> 468 <pre> 468 <pre> 469 &gt;&gt; @hoge( 1 + 2 ) 469 &gt;&gt; @hoge( 1 + 2 ) 470 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(466 | 470 polemy.failure.RuntimeException@polemy\eval.d(466): 471 [<REPL>:3:7] only @value layer can call native function: + 471 [<REPL>:3:7] only @value layer can call native function: + 472 [<REPL>:3:7] + 472 [<REPL>:3:7] + 473 </pre> 473 </pre> 474 <p> 474 <p> 475 まだエラーですね。これは要するに "+" の意味がわからない、と言っています。 475 まだエラーですね。これは要するに "+" の意味がわからない、と言っています。 476 <font color=red><b>レイヤ指定変数定義式</b></font> で、"+" の意味を教えてあげます。 476 <font color=red><b>レイヤ指定変数定義式</b></font> で、"+" の意味を教えてあげます。 477 </p> 477 </p> 478 <pre> 478 <pre> 479 &gt;&gt; @hoge "+" = fun(x, y) {x} | 479 &gt;&gt; @hoge + = fun(x, y) {x} 480 (function:182eca0:18435e0) 480 (function:182eca0:18435e0) 481 &gt;&gt; @hoge( 3 + 4 ) 481 &gt;&gt; @hoge( 3 + 4 ) 482 6 482 6 483 </pre> 483 </pre> 484 <p> 484 <p> 485 できました。 485 できました。 486 </p> 486 </p> 487 <p> 487 <p> 488 他の組み込み関数の意味も決めてみましょう。この <tt>@hoge</tt> レイヤでは、 488 他の組み込み関数の意味も決めてみましょう。この <tt>@hoge</tt> レイヤでは、 489 引き算のつもりで書いたコードが、掛け算になってしまうのだ! 489 引き算のつもりで書いたコードが、掛け算になってしまうのだ! 490 </p> 490 </p> 491 <pre> 491 <pre> 492 &gt;&gt; @hoge "-" = fun(x, y) {x * y} | 492 &gt;&gt; @hoge - = fun(x, y) {x * y} 493 (function:1b4c6a0:1b4fbe0) 493 (function:1b4c6a0:1b4fbe0) 494 &gt;&gt; @hoge( 5 - 6 ) 494 &gt;&gt; @hoge( 5 - 6 ) 495 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(469 | 495 polemy.failure.RuntimeException@polemy\eval.d(469): 496 [<REPL>:3:24] only @value layer can call native function: * 496 [<REPL>:3:24] only @value layer can call native function: * 497 [<REPL>:3:24] * 497 [<REPL>:3:24] * 498 [<REPL>:4:8] - 498 [<REPL>:4:8] - 499 </pre> 499 </pre> 500 <p> 500 <p> 501 5、の意味は 10 で 6 の意味は 12 なので、10 - 12 と見せかけて掛け算して 120 が返るのだ! 501 5、の意味は 10 で 6 の意味は 12 なので、10 - 12 と見せかけて掛け算して 120 が返るのだ! 502 と思いきや、エラーになってしまいました。なぜでしょう。それは、この "-" の定義、 502 と思いきや、エラーになってしまいました。なぜでしょう。それは、この "-" の定義、 ................................................................................................................................................................................ 505 </p> 505 </p> 506 <p> 506 <p> 507 ここは、「普通の」意味の掛け算を使いたいのです。 507 ここは、「普通の」意味の掛け算を使いたいのです。 508 この部分については、<tt>@value</tt> レイヤで計算して欲しい。 508 この部分については、<tt>@value</tt> レイヤで計算して欲しい。 509 そんなときは、レイヤ指定式を使います。 509 そんなときは、レイヤ指定式を使います。 510 </p> 510 </p> 511 <pre> 511 <pre> 512 &gt;&gt; @hoge "-" = fun(x, y) {<b>@value(@hoge(x) * @hoge(y))</b>} | 512 &gt;&gt; @hoge - = fun(x, y) {<b>@value(@hoge(x) * @hoge(y))</b>} 513 (function:1b086c0:1b4fbe0) 513 (function:1b086c0:1b4fbe0) 514 &gt;&gt; @hoge( 5 - 6 ) 514 &gt;&gt; @hoge( 5 - 6 ) 515 120 515 120 516 </pre> 516 </pre> 517 <p> 517 <p> 518 できました。掛け算は、<tt>@value</tt> レイヤの意味で実行します。 518 できました。掛け算は、<tt>@value</tt> レイヤの意味で実行します。 519 各変数は、<tt>@hoge</tt> レイヤで計算された意味を使います、という意味になります。 519 各変数は、<tt>@hoge</tt> レイヤで計算された意味を使います、という意味になります。 ................................................................................................................................................................................ 706 var ty = @type(y); 706 var ty = @type(y); 707 if tx=="runtime error" then ty 707 if tx=="runtime error" then ty 708 else if ty=="runtime error" then tx 708 else if ty=="runtime error" then tx 709 else if tx=="int" &amp;&amp; ty=="int" then "int" 709 else if tx=="int" &amp;&amp; ty=="int" then "int" 710 else "type error" 710 else "type error" 711 )}; 711 )}; 712 712 713 @type "+" = int_int_int; | 713 @type + = int_int_int; 714 @type "-" = int_int_int; | 714 @type - = int_int_int; 715 @type "&lt;" = int_int_int; | 715 @type &lt; = int_int_int; 716 </pre> 716 </pre> 717 <pre> 717 <pre> 718 &gt;&gt; @type( 1 + 2 ) 718 &gt;&gt; @type( 1 + 2 ) 719 int 719 int 720 &gt;&gt; @type( 1 + "foo" ) 720 &gt;&gt; @type( 1 + "foo" ) 721 type error 721 type error 722 </pre> 722 </pre> 723 <p> 723 <p> 724 「実行時エラーについては、それが起きなければ返すはずの型」を計算するという定義に、 724 「実行時エラーについては、それが起きなければ返すはずの型」を計算するという定義に、 725 ここではしています。さらに(ちょっと手抜きで int 以外を考えていない)if の型定義を考えると、 725 ここではしています。さらに(ちょっと手抜きで int 以外を考えていない)if の型定義を考えると、 726 こんな雰囲気。 726 こんな雰囲気。 727 </p> 727 </p> 728 <pre> 728 <pre> 729 @type "if" (c, t, e) {@value( | 729 @type if (c, t, e) {@value( 730 if( @type(c)=="int" || @type(c)=="runtime error" ) then 730 if( @type(c)=="int" || @type(c)=="runtime error" ) then 731 @type( int_int_int(t(), e()) ) 731 @type( int_int_int(t(), e()) ) 732 else 732 else 733 "type error" 733 "type error" 734 )}; 734 )}; 735 </pre> 735 </pre> 736 <p> 736 <p> ................................................................................................................................................................................ 1009 <script>explorer.outline.writeEnabled = false;</script> 1009 <script>explorer.outline.writeEnabled = false;</script> 1010 1010 1011 <dd><p> 1011 <dd><p> 1012 これはエラーになります。 1012 これはエラーになります。 1013 </p> 1013 </p> 1014 <pre> 1014 <pre> 1015 &gt;&gt; let _ = (@macro twice(x) {x;x} in twice(print("Hello"))) 1015 &gt;&gt; let _ = (@macro twice(x) {x;x} in twice(print("Hello"))) 1016 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\value.d(10 | 1016 polemy.failure.RuntimeException@polemy\value.d(109): 1017 [<REPL>:2:35] 'twice' is not set in @value layer 1017 [<REPL>:2:35] 'twice' is not set in @value layer 1018 </pre> 1018 </pre> 1019 <p> 1019 <p> 1020 どういうことかというと、<tt>@macro</tt> で定義したマクロはいつから使えるようになるかという話で、 1020 どういうことかというと、<tt>@macro</tt> で定義したマクロはいつから使えるようになるかという話で、 1021 この <tt>@macro twice(x) {x;x} in ...</tt> の部分は <tt>@value</tt> レイヤの式なので、 1021 この <tt>@macro twice(x) {x;x} in ...</tt> の部分は <tt>@value</tt> レイヤの式なので、 1022 まずこの式全体のマクロ展開が終わったあとにしか実行されないのです。<tt>twice</tt> 1022 まずこの式全体のマクロ展開が終わったあとにしか実行されないのです。<tt>twice</tt> 1023 がマクロと見なされはじめるのは、<tt>@macro</tt> 実行が終わった後。 1023 がマクロと見なされはじめるのは、<tt>@macro</tt> 実行が終わった後。 ................................................................................................................................................................................ 1158 <script>explorer.outline.decSymbolLevel();</script> 1158 <script>explorer.outline.decSymbolLevel();</script> 1159 1159 1160 1160 1161 </td></tr> 1161 </td></tr> 1162 <tr><td id="docfooter"> 1162 <tr><td id="docfooter"> 1163 Page was generated with 1163 Page was generated with 1164 <img src="candydoc/img/candydoc.gif" style="vertical-ali 1164 <img src="candydoc/img/candydoc.gif" style="vertical-ali 1165 on Tue Nov 30 10:23:12 2010 | 1165 on Thu Dec 2 09:14:39 2010 1166 1166 1167 </td></tr> 1167 </td></tr> 1168 </table> 1168 </table> 1169 </div> 1169 </div> 1170 <script> 1170 <script> 1171 explorer.packageExplorer.addModule("index"); 1171 explorer.packageExplorer.addModule("index"); 1172 explorer.packageExplorer.addModule("main"); 1172 explorer.packageExplorer.addModule("main");