Diff
Not logged in

Differences From Artifact [a25f52da129efe47]:

To Artifact [8335b49cb250b861]:


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