2011-12-14 7 views

答えて

6

ScalaでもJavaでもこのようなマクロはありません。もちろん、行番号情報はバイトコードに格納されていますが(デバッグの目的でも)、それを取得するAPIはありません。

クラス名と行番号を持つスタックトレースは、ネイティブThrowable.fillInStackTrace()によって生成されます。ロギングライブラリはThread.getStackTrace()を使用することもできます。

どちらの場合も、を解析し、スタックトレースを検索し、現在の場所を見つけます。スタックトレースの生成には時間がかかりますので避けてください。

+0

私はマクロがないことを知っていますが、何らかの方法でマクロ名を付ける必要がありました:-)とにかく、これは非常に悲しいニュースです - 私は多くの場所でそれを必要とします - しかし、いつも! – greenoldman

1

Scalaにマクロ機能を提供するプロジェクトです。

おそらくあなたは、あなたがsourcecodeライブラリは、マクロに基づいており、コンパイル時にメタデータを提供している

+0

これはLispマクロに関するプロジェクトなので、もっと複雑なことですが、非常に興味深いですが、ありがとうございます。 – greenoldman

2

必要なものを議論するプロジェクトチームに近づくことができました。 (自分のページから取られた)

例:

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

    log("foo") 
} 

これを印刷します:

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

コード内の任意の場所で使用できます。

関連する問題