MirahのホームページMirahはどのようなメタプログラミング機能を提供していますか?
Mirahのは言うコンパイル時メタプログラミングやマクロのためのさまざまなメカニズムをサポートしています。 Mirahでは動的言語の「オープンクラス」の感覚の多くが可能です。
しかし、私は詳細を見つけることができません。誰かが詳しい情報を持っていますか?
MirahのホームページMirahはどのようなメタプログラミング機能を提供していますか?
Mirahのは言うコンパイル時メタプログラミングやマクロのためのさまざまなメカニズムをサポートしています。 Mirahでは動的言語の「オープンクラス」の感覚の多くが可能です。
しかし、私は詳細を見つけることができません。誰かが詳しい情報を持っていますか?
ミラはコンパイル時マクロをサポートしています。それらを使用して、コンパイル時に実行される関数を定義して、構文ツリーを変更することができます。これにより、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にメールをお送りください。
素晴らしい回答、ありがとうございます!サルのパッチにこのミラのアプローチはありますか? –
実際には、拡張メソッドを追加する方法がありますが、 'times'は良い例ですが、メソッドをオーバーライドする方法は私が知る限り存在しません。それは常にそうではありません。 – BaroqueBobcat