2015-12-02 84 views
0

我正在嘗試將this answerthis question移植到scala-2.10。 這是我的嘗試:scala宏錯誤:未找到:值

Macros.scala

package myProject.macros 

import scala.reflect.macros.Context 
import scala.language.experimental.macros 

class LoggerImpl(val c: Context) { 
    import c.universe._                                 

    def getClassSymbol(s: Symbol): Symbol = if (s.isClass) s else getClassSymbol(s.owner) 

    def logImpl(msg: Expr[String]): Unit = { 
    val cl = getClassSymbol(c.enclosingClass.symbol).toString 
    // Do something with cl 
    // For this case cl should be "SomeObject" 
    } 
} 

object Logger { 
    def warning(msg: String): Unit = macro LoggerImpl.logImpl 
} 

XYZ.scala

package myProject.XYZ 

import myProject.macros.Logger 

object SomeObject { 

    def doSomething(...) = { 
    // Some operations 
    Logger.warning("sss") 
    } 
} 

但是當我嘗試建立我得到這些錯誤:

[scalac-2.10] /../Macros.scala:20: error: not found: value LoggerImpl 
[scalac-2.10] def warning(msg: String): Unit = macro LoggerImpl.logImpl 
[scalac-2.10]           ^
[scalac-2.10] /../XYZ.scala:18: error: not found: value LoggerImpl 
[scalac-2.10] def warning(msg: String): Unit = macro LoggerImpl.logImpl 
[scalac-2.10]           ^
[scalac-2.10] two errors found 

我看着this example,如果它們位於不同的包中,是不是有辦法讓宏工作?

+0

你想爲了將它恢復到2.10或2.11的版本將套件你呢? – Archeg

+0

我只需要堅持2.10 ..:/ –

回答

0

你可以試試這個:

object LoggerImpl { 

    def logImpl(c: Context)(msg: c.Expr[String]): c.Expr[Unit] = { 
    import c.universe._                                 

    def getClassSymbol(s: Symbol): Symbol = if (s.isClass) s else getClassSymbol(s.owner) 

    val cl = getClassSymbol(c.enclosingClass.symbol).toString 
    // Do something with cl 
    // For this case cl should be "SomeObject" 
    } 
} 

不幸的是我沒有手頭有斯卡拉2.10,但我想上面應該爲你工作,因爲你的代碼不能編譯斯卡拉2.11要麼和實現的10和11似乎沒有太大的不同

請注意,您需要返回c.Expr[Unit]爲它做任何事情,並且您還需要在一個單獨的模塊中編譯它 - 最後是scala宏的要求

+0

是不是像在同一個項目中的不同的包中編譯它們一樣? –