编译时间类型跟踪

Deb*_*ski 4 scala metaprogramming

是否可以在Scala表达式周围添加一些魔术构造,以便在编译期间打印出类型?例如,有一些类,魔术函数,元编程类型,它具有:

val i = 1
Some(11).map(Trace(_ + 1))

// compile
// prints: Int
Run Code Online (Sandbox Code Playgroud)

Jam*_*Iry 9

不完全是,但是如何做到这一点

$ cat Test.scala
def Trace[T] = identity[T] _

val i = 1
Some(11) map {x => Trace(x + 1)}



$ scala -Xprint:typer Test.scala 2>&1 | egrep --o 'Trace\[.*\]'
Trace[T >: Nothing <: Any]
Trace[Int]
Run Code Online (Sandbox Code Playgroud)

第一个Trace来自Trace的定义,可以忽略.相同的参数(-Xprint:typer)也适用于scalac.