2011-12-14 3 views

Odpowiedz

6

Nie ma takiego makra ani w Scali, ani w Javie. Oczywiście informacje o numerze linii są przechowywane w kodzie bajtowym (również w celu debugowania), ale nie ma interfejsu API, aby go uzyskać.

Ślady stosu z nazwami klas i numerami linii są generowane przez natywny Throwable.fillInStackTrace(). Biblioteki logujące mogą również używać Thread.getStackTrace().

W obu przypadkach sprowadza się do analizowanie ułożenia stosu i znajdowanie naszej bieżącej lokalizacji. Należy zauważyć, że generowanie śladu stosu jest czasochłonne i należy go unikać.

+0

Wiem, że nie ma makra, ale musiałem w jakiś sposób nazwać makro :-) W każdym razie jest to bardzo smutna wiadomość - potrzebuję jej w wielu miejscach - ale dziękuję oczywiście, bardzo informacyjny jak zwykły! – greenoldman

1

Jest to projekt zapewniający możliwość makra w Scala.

Może podejście zespołu projektowego, aby omówić to, co trzeba

+0

To jest projekt o Lisp-makrach, więc coś o wiele bardziej złożonego, ale mimo to jest bardzo interesujące, dziękuję. – greenoldman

2

Biblioteka sourcecode opiera się na makrach i dostarcza metadanych w czasie kompilacji.

Przykład (pobrano z ich strony):

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

    log("foo") 
} 

Drukuje:

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

Możesz używać implicite w dowolnym miejscu kodu.

Powiązane problemy