2011-08-09 8 views
2

MirahのホームページMirahはどのようなメタプログラミング機能を提供していますか?

Mirahのは言うコンパイル時メタプログラミングやマクロのためのさまざまなメカニズムをサポートしています。 Mirahでは動的言語の「オープンクラス」の感覚の多くが可能です。

しかし、私は詳細を見つけることができません。誰かが詳しい情報を持っていますか?

答えて

4

ミラはコンパイル時マクロをサポートしています。それらを使用して、コンパイル時に実行される関数を定義して、構文ツリーを変更することができます。これにより、Javaで見られるいくつかの一般的なパターンを、Rubyで見られるようなパターンに単純化することができます。

たとえば、timesはマクロとして実装されています。現在はMirahではなくRubyで書かれていますが、

あなたは数字0-4

を印刷するこの

5.times do |i| 
    puts i 
end 

のようにそれを使用することができ、Javaでそれはあなたはもちろん、独自に定義することができます

for(int i=0;i < 5; i++) { 
    System.out.println(i); 
} 

のようになります。マクロをmacro defマクロを使用します。たとえば、共通のlogger4jパターンを使用して、デバッグ文字列を構成する前にデバッグが有効かどうかをチェックしたいとします。マクロを使用すると、私はこのような何かをやってチェックが暗黙的にすることができます:

私は私が構文木の一枚を作成していている上で何が起こっているか、この

debug "something low level is going on: " + gimme_all_the_bytes_as_a_string 

のように呼び出すことができます

macro def debug debug_input 
    quote do 
     if logger.debugEnabled 
     logger.debug `debug_input` 
     end 
    end 
    end 

quote do ... end"something low level is going on: " + gimme_all_the_bytes_as_a_stringの式をMirahマクロのquoteブロックにある `` s ''を使って削除すると、それらの中の構文木ノードは引用符で囲まれません。

現在、Mirahの仕組みに関するリソースはあまり多くありませんが、Githubのexample codeをご覧ください。より多くのご質問がある場合はmailing listにメールをお送りください。

+0

素晴らしい回答、ありがとうございます!サルのパッチにこのミラのアプローチはありますか? –

+0

実際には、拡張メソッドを追加する方法がありますが、 'times'は良い例ですが、メソッドをオーバーライドする方法は私が知る限り存在しません。それは常にそうではありません。 – BaroqueBobcat

関連する問題