scala宏与新标识符

时间:2016-04-14 10:25:56

标签: scala macros scala-quasiquotes

我有一个宏,我想用它来记录执行一个可能返回一些有用的块的时间。所以,如果我有类似的东西 if ($createdEvent) { echo 'Success'; } else { echo 'Error'; } 我将更改为val y = f(x)以获取在日志中执行该功能所花费的时间。

我几乎拥有我想要的东西,但是当使用新的术语名称来避免名称冲突时,例如在t0和t1之间,我收到错误:

val y = Timed(f(x))

如何让那些freshQuermNames使用quasiquotes?

Error:(22, 15) Can't unquote reflect.runtime.universe.TermName, consider providing an implicit instance of Liftable[reflect.runtime.universe.TermName]
         val $kk = System.nanoTime()
          ^

1 个答案:

答案 0 :(得分:0)

你不想要一个TermName,你想要一个Ident

val kk = Ident(TermName("kk"))

但是如果标识符的名称是常量,那么当你刚刚写完时,没有理由甚至构造这样的标识符:

q"""
   val kk = System.nanoTime
   ...
"""

更改它将解决该问题,但还有其他问题。在quasiquotes中未定义t0,并且您定义的所有其他术语名称实际上都没有。

我不明白为什么你需要一个宏,当正常的方法完成工作时。宏将增加代码的大小(如果您经常使用它,则会显着增加)。