Трассировка типа времени компиляции - PullRequest
4 голосов
/ 14 февраля 2011

Можно ли добавить магическое построение вокруг выражения Scala, чтобы оно печатало тип во время компиляции?Например, есть некоторый класс, магическая функция, тип метапрограммирования, который делает:

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

// compile
// prints: Int

Ответы [ 4 ]

9 голосов
/ 14 февраля 2011

Не совсем, но как насчет этого

$ 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]

Первая трассировка происходит от определения трассировки и может быть проигнорирована. Этот же параметр (-Xprint: typer) также работает со скалаком.

4 голосов
/ 14 ноября 2011

Если что-то становится действительно неприятным, вы можете использовать это:

scala -Xprint:typer -Xprint-types

Становится трудно читать, но точно говорит вам, что думает компилятор.

1 голос
/ 15 февраля 2011

Примерно так будет работать при времени выполнения

def Type[T](x:T):T = {println(x.asInstanceOf[AnyRef].getClass()); x }
0 голосов
/ 14 февраля 2011

Нет, такого нет.Плагин компилятора может это сделать.

...