Diff
Not logged in

Differences From Artifact [c411cf72312ff15e]:

To Artifact [b0a85a436fa9ea4b]:


318 <pre> 318 <pre> 319 &gt;&gt; @value( 1 + 2 ) 319 &gt;&gt; @value( 1 + 2 ) 320 3 320 3 321 </pre> 321 </pre> 322 他のレイヤで動かしてみましょう。適当に。「<tt>@hoge</tt> レイヤ」で。 322 他のレイヤで動かしてみましょう。適当に。「<tt>@hoge</tt> レイヤ」で。 323 <pre> 323 <pre> 324 &gt;&gt; @hoge( 3 ) 324 &gt;&gt; @hoge( 3 ) 325 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(138 | 325 polemy.failure.RuntimeException@polemy\eval.d(138): 326 [<REPL>:4:8] lift function for @hoge is not registered 326 [<REPL>:4:8] lift function for @hoge is not registered 327 </pre> 327 </pre> 328 <p> 328 <p> 329 エラーになりました。Polemy のインタプリタは、起動時には、<tt>@value</tt> 329 エラーになりました。Polemy のインタプリタは、起動時には、<tt>@value</tt> 330 レイヤでのコードの意味しか知りません。<tt>@hoge</tt> レイヤでは <tt>3</tt> 330 レイヤでのコードの意味しか知りません。<tt>@hoge</tt> レイヤでは <tt>3</tt> 331 というのがどんな意味なのか、わかりません!というエラーが出ています。 331 というのがどんな意味なのか、わかりません!というエラーが出ています。 332 </p> 332 </p> ................................................................................................................................................................................ 350 6 350 6 351 </pre> 351 </pre> 352 <p> 352 <p> 353 では、1+2 を <tt>@hoge</tt> レイヤで動かしてみましょう。 353 では、1+2 を <tt>@hoge</tt> レイヤで動かしてみましょう。 354 </p> 354 </p> 355 <pre> 355 <pre> 356 &gt;&gt; @hoge( 1 + 2 ) 356 &gt;&gt; @hoge( 1 + 2 ) 357 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(466 | 357 polemy.failure.RuntimeException@polemy\eval.d(466): 358 [<REPL>:3:7] only @value layer can call native function: + 358 [<REPL>:3:7] only @value layer can call native function: + 359 [<REPL>:3:7] + 359 [<REPL>:3:7] + 360 </pre> 360 </pre> 361 <p> 361 <p> 362 まだエラーですね。これは要するに "+" の意味がわからない、と言っています。 362 まだエラーですね。これは要するに "+" の意味がわからない、と言っています。 363 $(RED $(B レイヤ指定変数定義式)) で、"+" の意味を教えてあげます。 363 $(RED $(B レイヤ指定変数定義式)) で、"+" の意味を教えてあげます。 364 </p> 364 </p> 365 <pre> 365 <pre> 366 &gt;&gt; @hoge "+" = fun(x, y) {x} | 366 &gt;&gt; @hoge + = fun(x, y) {x} 367 (function:182eca0:18435e0) 367 (function:182eca0:18435e0) 368 &gt;&gt; @hoge( 3 + 4 ) 368 &gt;&gt; @hoge( 3 + 4 ) 369 6 369 6 370 </pre> 370 </pre> 371 <p> 371 <p> 372 できました。 372 できました。 373 </p> 373 </p> 374 <p> 374 <p> 375 他の組み込み関数の意味も決めてみましょう。この <tt>@hoge</tt> レイヤでは、 375 他の組み込み関数の意味も決めてみましょう。この <tt>@hoge</tt> レイヤでは、 376 引き算のつもりで書いたコードが、掛け算になってしまうのだ! 376 引き算のつもりで書いたコードが、掛け算になってしまうのだ! 377 </p> 377 </p> 378 <pre> 378 <pre> 379 &gt;&gt; @hoge "-" = fun(x, y) {x * y} | 379 &gt;&gt; @hoge - = fun(x, y) {x * y} 380 (function:1b4c6a0:1b4fbe0) 380 (function:1b4c6a0:1b4fbe0) 381 &gt;&gt; @hoge( 5 - 6 ) 381 &gt;&gt; @hoge( 5 - 6 ) 382 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\eval.d(469 | 382 polemy.failure.RuntimeException@polemy\eval.d(469): 383 [<REPL>:3:24] only @value layer can call native function: * 383 [<REPL>:3:24] only @value layer can call native function: * 384 [<REPL>:3:24] * 384 [<REPL>:3:24] * 385 [<REPL>:4:8] - 385 [<REPL>:4:8] - 386 </pre> 386 </pre> 387 <p> 387 <p> 388 5、の意味は 10 で 6 の意味は 12 なので、10 - 12 と見せかけて掛け算して 120 が返るのだ! 388 5、の意味は 10 で 6 の意味は 12 なので、10 - 12 と見せかけて掛け算して 120 が返るのだ! 389 と思いきや、エラーになってしまいました。なぜでしょう。それは、この "-" の定義、 389 と思いきや、エラーになってしまいました。なぜでしょう。それは、この "-" の定義、 ................................................................................................................................................................................ 392 </p> 392 </p> 393 <p> 393 <p> 394 ここは、「普通の」意味の掛け算を使いたいのです。 394 ここは、「普通の」意味の掛け算を使いたいのです。 395 この部分については、<tt>@value</tt> レイヤで計算して欲しい。 395 この部分については、<tt>@value</tt> レイヤで計算して欲しい。 396 そんなときは、レイヤ指定式を使います。 396 そんなときは、レイヤ指定式を使います。 397 </p> 397 </p> 398 <pre> 398 <pre> 399 &gt;&gt; @hoge "-" = fun(x, y) {$(B @value(@hoge(x) * @hoge(y)))} | 399 &gt;&gt; @hoge - = fun(x, y) {$(B @value(@hoge(x) * @hoge(y)))} 400 (function:1b086c0:1b4fbe0) 400 (function:1b086c0:1b4fbe0) 401 &gt;&gt; @hoge( 5 - 6 ) 401 &gt;&gt; @hoge( 5 - 6 ) 402 120 402 120 403 </pre> 403 </pre> 404 <p> 404 <p> 405 できました。掛け算は、<tt>@value</tt> レイヤの意味で実行します。 405 できました。掛け算は、<tt>@value</tt> レイヤの意味で実行します。 406 各変数は、<tt>@hoge</tt> レイヤで計算された意味を使います、という意味になります。 406 各変数は、<tt>@hoge</tt> レイヤで計算された意味を使います、という意味になります。 ................................................................................................................................................................................ 553 var ty = @type(y); 553 var ty = @type(y); 554 if tx=="runtime error" then ty 554 if tx=="runtime error" then ty 555 else if ty=="runtime error" then tx 555 else if ty=="runtime error" then tx 556 else if tx=="int" && ty=="int" then "int" 556 else if tx=="int" && ty=="int" then "int" 557 else "type error" 557 else "type error" 558 )}; 558 )}; 559 559 560 @type "+" = int_int_int; | 560 @type + = int_int_int; 561 @type "-" = int_int_int; | 561 @type - = int_int_int; 562 @type "<" = int_int_int; | 562 @type &lt; = int_int_int; 563 </pre> 563 </pre> 564 <pre> 564 <pre> 565 &gt;&gt; @type( 1 + 2 ) 565 &gt;&gt; @type( 1 + 2 ) 566 int 566 int 567 &gt;&gt; @type( 1 + "foo" ) 567 &gt;&gt; @type( 1 + "foo" ) 568 type error 568 type error 569 </pre> 569 </pre> 570 <p> 570 <p> 571 「実行時エラーについては、それが起きなければ返すはずの型」を計算するという定義に、 571 「実行時エラーについては、それが起きなければ返すはずの型」を計算するという定義に、 572 ここではしています。さらに(ちょっと手抜きで int 以外を考えていない)if の型定義を考えると、 572 ここではしています。さらに(ちょっと手抜きで int 以外を考えていない)if の型定義を考えると、 573 こんな雰囲気。 573 こんな雰囲気。 574 </p> 574 </p> 575 <pre> 575 <pre> 576 @type "if" (c, t, e) {@value( | 576 @type if (c, t, e) {@value( 577 if( @type(c)=="int" || @type(c)=="runtime error" ) then 577 if( @type(c)=="int" || @type(c)=="runtime error" ) then 578 @type( int_int_int(t(), e()) ) 578 @type( int_int_int(t(), e()) ) 579 else 579 else 580 "type error" 580 "type error" 581 )}; 581 )}; 582 </pre> 582 </pre> 583 <p> 583 <p> ................................................................................................................................................................................ 796 )) 796 )) 797 $(SECTION 微妙なところ3, $(SECBODY 797 $(SECTION 微妙なところ3, $(SECBODY 798 <p> 798 <p> 799 これはエラーになります。 799 これはエラーになります。 800 </p> 800 </p> 801 <pre> 801 <pre> 802 &gt;&gt; let _ = (@macro twice(x) {x;x} in twice(print("Hello"))) 802 &gt;&gt; let _ = (@macro twice(x) {x;x} in twice(print("Hello"))) 803 polemy.failure.RuntimeException@C:\Develop\Projects\Polemy\polemy\value.d(10 | 803 polemy.failure.RuntimeException@polemy\value.d(109): 804 [<REPL>:2:35] 'twice' is not set in @value layer 804 [<REPL>:2:35] 'twice' is not set in @value layer 805 </pre> 805 </pre> 806 <p> 806 <p> 807 どういうことかというと、<tt>@macro</tt> で定義したマクロはいつから使えるようになるかという話で、 807 どういうことかというと、<tt>@macro</tt> で定義したマクロはいつから使えるようになるかという話で、 808 この <tt>@macro twice(x) {x;x} in ...</tt> の部分は <tt>@value</tt> レイヤの式なので、 808 この <tt>@macro twice(x) {x;x} in ...</tt> の部分は <tt>@value</tt> レイヤの式なので、 809 まずこの式全体のマクロ展開が終わったあとにしか実行されないのです。<tt>twice</tt> 809 まずこの式全体のマクロ展開が終わったあとにしか実行されないのです。<tt>twice</tt> 810 がマクロと見なされはじめるのは、<tt>@macro</tt> 実行が終わった後。 810 がマクロと見なされはじめるのは、<tt>@macro</tt> 実行が終わった後。