2011-12-14 8 views

Respuesta

6

No existe tal macro ni en Scala ni en Java. Por supuesto, la información del número de línea se almacena en el bytecode (también para fines de depuración) pero no hay API para obtenerlo.

Los rastreos de pila con nombres de clase y números de línea se generan a través del Throwable.fillInStackTrace() nativo. Las bibliotecas de registro también pueden usar Thread.getStackTrace().

En ambos casos se reduce a parse seguimiento de pila y encuentra nuestra ubicación actual. Tenga en cuenta que generar trazas de pila requiere mucho tiempo y debe evitarse.

+0

Sé que no hay macro, pero tuve que nombrar de alguna manera macro :-) De todos modos, esta es una noticia muy triste, la necesito en muchos lugares, pero gracias por supuesto, es muy informativa. ¡usual! – greenoldman

1

El es un proyecto para proporcionar una capacidad de macro en Scala.

Tal vez podría acercarse al equipo del proyecto para discutir lo que necesita

+0

Es un proyecto sobre Lisp-macros, por lo que es mucho más complejo, pero es muy interesante, no obstante, gracias. – greenoldman

2

La biblioteca sourcecode se basa en las macros y proporciona metadatos en tiempo de compilación.

Ejemplo (tomado de su página):

object Main extends App { 
    def log(message: String)(implicit line: sourcecode.Line, file: sourcecode.File) = 
    println(s"${file.value}:${line.value} $message") 

    log("foo") 
} 

Esto imprimirá:

/Users/jhoffmann/Development/sourcecode/src/main/scala/Main.scala:5 foo

Puede usar los implicits en cualquier parte de su código.

Cuestiones relacionadas