2013-02-04 3 views
12

반성이 아직 초기 단계였던 스칼라 2.10.0 이정표에, 내가 REPL에서 코드 스 니펫 트리를보기 위해 어떻게 사용할 수 있을지에 대한 I asked a question. 훌륭한 대답은 내가 물어 본 것보다 더 나아 갔고, 나무를 파싱하고 평가하는 데 어떻게 사용될 수 있는지를 보여 주었기 때문에 나는 오늘 진행 한 작은 프로젝트에서이를 사용하려고 노력했다. REPL 정의를보기 위해 Scala ToolBox를 얻으려면 어떻게해야합니까?

불행하게도, 코드 분석 및 REPL 정의를 참조하지 않는 것 그렇게 평가 :

scala> val x = 1 
x: Int = 1 

scala> import scala.tools.reflect.ToolBox 
import scala.tools.reflect.ToolBox 

scala> val tb = scala.reflect.runtime.universe.runtimeMirror(
    getClass.getClassLoader).mkToolBox() 
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = ... 

scala> tb.eval(tb.parse("x")) 
scala.tools.reflect.ToolBoxError: reflective compilation has failed: 

not found: value x 

이 REPL에서 만든 정의를 인식 얻을 수있는 방법이 있나요를?

+0

REPL에 없습니까? 나는 sbt 프로젝트에서 똑같은 코드 (https://gist.github.com/jedesah/5812481)를 썼다. 그리고 나는 REPL과 같은 행동을한다. 이것이 툴박스가 다른 컨텍스트에서 작동하는 방법이라면, 나는 매우 알고 싶어한다. – jedesah

+0

@UndercoverAgent 도구 상자의 코드는 "루트"에서 접근 할 수있는 모든 것에 액세스 할 수 있습니다. 그렇지 않으면 매우 쓸모가 없습니다. 표시 한 경우 해당 변수는 "루트"에서 사용할 수 없습니다. –

+0

쓸데없는 말은 강한 단어입니다. 자체 포함 된 나무를 평가하는 데 사용할 수 있습니다. 어쨌든, 당신이 작업하고있는이 작은 프로젝트는 오픈 소스입니까? 외부 (트리 자체에서) 정의에 액세스하는 예를보고 싶습니다. "루트"에서 도달 한 의미를 정확히 알지 못합니다. – jedesah

답변

6

최근 repl에서 타입 매크로를 지원하려고 할 때 파헤 치기 때문에 왜 작동하지 않는지 잘 설명 할 수 있습니다. 작동 시키려면 다음 단계가 필요합니다.

repl에 입력 된 모든 스 니펫이 컴파일되기 전에 일부 상용구로 묶여 있음을 알고 있습니다. 따라서 x는 이상한 이름의 패키지에서 중첩 된 중첩 된 객체의 필드가됩니다.

분명히 repl은 정의 된 모든 기호를 추적하고 생성 된 상용구와 함께 필수 가져 오기를 주입합니다. 따라서 후속 라인에서는 x가 적합하지 않음을 알 수 있습니다. 대조적으로 도구 상자는 repl의 클래스 로더를 단순히 재사용하지만 가져 오기에 대해서는 아무 것도하지 않으므로 실패합니다.

해결 방법은 repl를 나타내는 개체에 어떻게 든 접근하여 정의 된 기호에 대해 물어 본 다음 도구 상자에 공급하는 코드에 해당 가져 오기를 생성하는 것입니다. 티켓을 신청할 경우, 2.10.1 코드 동결 광기가 끝난 후 해결 방법을 코딩하려고합니다 (이번 주말).

+0

[SI-7081] (https://issues.scala-lang.org/browse/SI-7081) –