2015-01-13 2 views
6

私は次のコードを持っている:定義されている同じファイルにマクロを使用するトリックはありますか?

object Macros { 

    import scala.language.experimental.macros 
    import scala.reflect.macros.blackbox 

    def hello(): Unit = macro hello_impl 

    def hello_impl(c: blackbox.Context)(): c.Expr[Unit] = { 
    import c.universe._ 
    reify { 
     println("Hello World!") 
    } 
    } 
} 


object Main { 

    def main(args: Array[String]): Unit = { 
    Macros.hello() 
    } 

} 

をそれは、次のコンパイルエラーがスローされます。

Error:(21, 17) macro implementation not found: hello 
(the most common reason for that is that you cannot use macro implementations in the same compilation run that defines them) 
    Macros.hello() 
       ^

私の質問は次のとおりです。でマクロ展開を使用するためには、コンパイラを「だます」する方法がありますそれらが定義されている同じファイルですか?私の動機は次のとおりです。Scalaでコードを作成するのが好きで、最近はオンライン裁判官Codeforcesにいくつかの問題を提出していましたが、Scalaの構築が非常に遅いことが判明しました。だから、私はそれらの構造を高速に実行するためにいくつかのマクロ展開を作成したいと思います。しかし、私は複数のファイルを提出することはできません。

ありがとう!

+0

私はこれが可能ではないと思います。わかりませんが、(コンパイルが必要な)マクロを作成し、コンパイルされていないときに使用するのは奇妙に聞こえます。しかし、それらを異なるファイルで定義することは可能でしょうか?確かに。 ScalaでCFをやっているときのもう一つのことは、フィルタやflatMapなどのようなものを避けるべきです。大きなコレクションでは遅いからです。配列に固執すると、大きなコレクションでJavaに近いパフォーマンスが得られるはずです。 –

+0

私はあなたに「スティック・ツー・アレイ」ポリシーについて同意します。しかしfor-comprehensionsは配列であってもmap-flatMap-filterシーケンスに変換されている可能性があるため、非常に遅いことが判明しました。たとえば、for-comprehensionsによってTLEが生成されるため、これを記述するよりもJavaで記述することが望ましいです(http://codeforces.com/contest/166/submission/8828271)。 – ale64bit

+0

私はそのコードでよく見ていることは、スキャナが超低速だということです。代わりに入力ストリームを使用して独自のクラスを作成してください。これをチェックしてください:https://kattis.csc.kth.se/doc/src/Kattio.java(私の学校のエンジンのカスタムリーダー) –

答えて

5

現時点では、これはScala 2.10および2.11の本番リリースでは不可能です。 scala.metaでこれを達成できるかもしれませんが、それは将来的にはうまくいきます。

関連する問題