2015-12-02 47 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

是不是像在同一个项目中的不同的包中编译它们一样? –