【发布时间】:2014-02-25 16:14:50
【问题描述】:
我定义了以下宏来从当前位置获取文件、行和对象/类: http://pastebin.com/UsNLemnK
使用SBT,我定义了两个项目,为了先编译宏,然后是使用这些宏的实际项目。
这些宏的用途是用于日志方法:
def log( msg: Any, srcFile: String = "", srcLine: String = "", srcClass:String = "")
然后我使用这个日志方法如下:
log(msg, s"$F_",s"$L_",s"$C_")
其中 F_、L_ 和 C_ 在宏中定义。
现在,我想创建一个快捷方式来避免这个样板,然后调用:
log(msg)
应该自动替换为
log(msg, s"$F_",s"$L_",s"$C_")
我可以定义一个宏来做到这一点:
def log_(msg: String) : Unit = macro logImpl
def logImpl( c: Context )(msg: c.Expr[String]): c.Expr[Unit] = {
import c.universe._
reify( log(msg.splice, srcFile=s"$F_", srcLine=s"$L_", srcClass=s"$C_") )
}
但是再说一遍,这个宏需要在项目之前编译好,日志函数本身是在哪里定义的……所以我没看到怎么解决编译依赖循环……
关于如何做到这一点的任何建议? 谢谢
【问题讨论】:
-
是什么阻止您将
log函数移至宏项目? -
感觉不太“干净”,因为日志功能非常复杂......我必须将许多部分从我的核心项目移动到宏项目。我希望有更好的方法
标签: scala scala-2.10 scala-macros