2016-10-27 7 views
0

私はメソッドの実行に時間を掛ける簡単なマクロ注釈を書くことを試みています。メソッド定義に注釈を付けるか、メソッド呼び出しに注釈を付けるだけです。Scala - マクロアノテートメソッドが呼び出す?

アノテーションメソッドの定義はうまくいきます。しかし

object Main { 
    def main(args:Array[String]): Unit ={ 
    @MyMacro 
    doTest() //"Hello World" 
    } 
} 

が構文上正しくありません。 intellijは:Unit ={の後に}と「予期している」と訴えているので、@MyMacroを削除すると消える警告が表示されます。

メソッドコール(または任意の式)に注釈を付ける正しい方法は何ですか?

(例えば、私はgetXへのすべての呼び出しのためのタイミングを得ることに興味がないかもしれませんが、私は、コード内の1つの特定の場所でそれに費やした時間を測定することもできます。

val x = @MyMacro getX() 

)を

を更新これは動作します:

object Main { 
    def main(args:Array[String]): Unit ={ 
    hello() 
    } 

    @MyMacro 
    def hello(): Unit ={ 
    println("Hello World") 
    } 
} 

これはコンパイルされません:

object Main { 
    def main(args:Array[String]): Unit ={ 
    hello(): @MyMacro 
    } 

    def hello(): Unit ={ 
    println("Hello World") 
    } 
} 

を私は単に両方の問題の世話をする必要があります

object BuildSettings { 
    val buildSettings = Defaults.defaultSettings ++ Seq(
    version := "0.0.1", 
    scalaVersion := "2.11.8", 
    scalacOptions += "", 
    crossScalaVersions := Seq("2.10.2", "2.10.3", "2.10.4", "2.10.5", "2.10.6", "2.11.0", "2.11.1", "2.11.2", "2.11.3", "2.11.4", "2.11.5", "2.11.6", "2.11.7", "2.11.8"), 
    resolvers += Resolver.sonatypeRepo("releases"), 
    addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full) 
) 
} 

object ScalaMacroDebugBuild extends Build { 
    import BuildSettings._ 

    lazy val root: Project = Project(
    "root", 
    file("."), 
    settings = buildSettings 
) aggregate(macros, examples) 

    lazy val macros: Project = Project(
    "macros", 
    file("macros"), 
    settings = buildSettings ++ Seq(
     libraryDependencies <+= (scalaVersion)("org.scala-lang" % "scala-compiler" % _)) 
) 

    lazy val examples: Project = Project(
    "examples", 
    file("examples"), 
    settings = buildSettings 
) dependsOn(macros) 
} 

を使用して、sbtしてコンパイルしてる

Error:(10, 15) macro annotation could not be expanded (the most common reason for that is that you need to enable the macro paradise plugin; another possibility is that you try to use macro annotation in the same compilation run that defines it) 
hello(): @MyMacro 
     ^

ため?

答えて

0

An annotation of an expression e appears after the expression e, separated by a colon.

のでval x = getX(): @MyMacro動作するはずです。

+0

ええと...私はそれにいくつか問題があるようです(上記の編集を参照)。 – User1291

+0

表現上のマクロ注釈はサポートされていないことがありますか? http://docs.scala-lang.org/overviews/macros/annotations.html確かにそれらに言及していない: "トップレベルまたはネストされた_definition_に注釈を付けることは、Scalaがマクロとして認識するもので注釈をつける"; "クラスやオブジェクトだけでなく、任意の定義にも適用されます_"。 –

+0

それは残念です。だから私はそのような機能性が必要かどうか、私はダイナミックマクロを見なければならないだろうと思う? – User1291

関連する問題