Diff
Not logged in

Differences From Artifact [c411cf72312ff15e]:

To Artifact [b0a85a436fa9ea4b]:


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