2014-02-19 2 views
3

현재 파일의 파일 이름 (코드가 작성된 경우)이 스칼라로 표시됩니까?현재 파일의 파일 이름을 스칼라로 가져옵니다.

감사합니다 (... 또는 전체 경로) 내 수업처럼

은 COM/내 사이트/응용 프로그램/myclass.scala 같은 파일에 내가 "myclass.scala"를 반환하는 메소드를 호출 할 당신!

답변

4

이 작업은 버전 2.10에서 사용할 수있는 실험적 언어 기능 인 Scala macros으로 수행 할 수 있습니다.

매크로를 사용하면 소스 코드 파싱 단계에서 AST 건물과 상호 작용하고 실제 컴파일이 수행되기 전에 AST의 트리를 수정할 수 있습니다.

Context 개체를 사용하여 컴파일 컨텍스트에 대한 정보를 매크로에서 사용할 수 있기 때문에 구문 분석 단계에서 원본 파일 이름을 검색하고이를 String 리터럴로 반환하여 해당 위치에 삽입 할 수 있습니다 AST에서 매크로 호출의

다음은 소스 파일 이름을 반환하는 작업 예제입니다. 예는 두 개의 파일로 분할된다 :

매크로 정의되고 구현되는 소스 파일 :

// Contents of: "Macros.scala" 

import scala.reflect.macros.Context 
import scala.language.experimental.macros 

object Macros { 
    def sourceFile: String = macro sourceFileImpl 
    def sourceFileImpl(c: Context) = { 
     import c.universe._ 
     c.Expr[String](Literal(Constant(c.enclosingUnit.source.path.toString))) 
    } 
} 

매크로 사용되는 다른 소스 파일 :

// Contents of: "Main.scala" 

object Main extends App { 
    val fileName = Macros.sourceFile 
    println(fileName) 
} 

매크로 구현 및 을 사용하는 코드는 다른 소스 파일에이어야합니다. 반환 된 파일 이름은 이며 올바른 매크로는입니다. 즉, 매크로 호출이있는 소스 파일의 이름입니다.

+1

은 더 이상 사용되지 않습니다. 전체 경로 또는 파일 이름입니까? – matanster

+0

안녕하세요. Matt. Scala 2.11에서 예,이 API는 더 이상 사용되지 않습니다. 의견을 보내 주셔서 감사합니다. 특히 Scala 2.11을 대상으로 새로운 질문을 만들 수 있습니다. –

+0

질문이 어떤 스칼라 버전과 관련이 없으므로 어쩌면 여기에 답변이나 의견으로 2.11의 동등한 솔루션을 추가하십시오. – matanster

관련 문제