2

Mirahのホームページによると

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

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

4

1 に答える 1

4

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

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

こんな感じで使えます

5.times do |i|
  puts i
end

0~4の数字を出力する

Javaでは、次のようになります

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

もちろん、マクロを使用して独自のマクロを定義することもできますmacro def。たとえば、デバッグ文字列を作成する前に、デバッグが有効かどうかをチェックする一般的な logger4j パターンを使用したいとします。マクロを使用すると、次のようにしてチェックを暗黙的に行うことができます。

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

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

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

そこで何が起こっているのかというと、 を使用して構文ツリーの一部を作成し、Mirah マクロのクォート ブロックで構文ツリー ノードの引用符を外す ``s を使用して式をそこにquote do ... endドロップしています。"something low level is going on: " + gimme_all_the_bytes_as_a_string

現在、Mirah の仕組みに関するリソースはあまり多くありませんが、Githubでサンプル コードを確認できます。さらに質問がある場合は、お気軽にメーリング リストにメールを送信してください。

于 2011-08-14T20:11:19.520 に答える