2012-01-18 14 views
14

Nie jestem pewien, jak napisać kod, który pozwoli wpaść na tłumacza do Scala 2.9 kodu. To pytanie jest kontynuacją this one, który zapytał, co stanowi równowartość Scala,Jak napisać kod Scala 2.9, który pozwoli wpaść na tłumacza

import pdb 
pdb.set_trace() 

był od Pythona. Porada udzielona tam była głównie dla Scala 2.8, a powiązane pakiety nie istnieją już w ich poprzedniej formie. Mianowicie

  1. scala.nsc.tools.nsc.Interpreter.{break, breakIf} zostały przeniesione do scala.nsc.tools.nsc.interpreter.ILoop.{break, breakIf}
  2. DebugParam jest teraz NamedParam w scala.tools.nsc.interpreter

Jak podano w pierwotnym post, ścieżka klasy procesu macierzystego jest nie został automatycznie przekazany do nowego interpretera, dlatego przedstawiono obejście tego problemu: here. Niestety, wiele przywoływanych tam klas/metod zmieniło się i nie jestem do końca pewien, jak zmodyfikować kod, który będzie się zachowywał "oczekiwany".

Dzięki!

EDIT: Oto mój kod testowy, który przy obecnych kompiluje się i działa, ale stara się wykonać coś w wynikach debugera w stosowaniu zamrożenia jeśli skompilowany przez scalac i wykonywane przez scala

import scala.tools.nsc.interpreter.ILoop._ 

object Main extends App { 

    case class C(a: Int, b: Double, c: String) { 
    def throwAFit(): Unit = { 
     println("But I don't wanna!!!") 
    } 
    } 

    // main 
    override def main(args: Array[String]): Unit = { 

    val c = C(1, 2.0, "davis") 

    0.until(10).foreach { 
     i => 
     println("i = " + i) 
     breakIf(i == 5) 
    } 
    } 
} 

Edit2: Jak moja obecna konfiguracja działa przez sbt, odkryłem, że ten temat jest objęty in the FAQ (u dołu strony). Jednak nie rozumiem tego wyjaśnienia, a wszelkie wyjaśnienia na temat MyType byłyby nieocenione.

Edit3: kolejna dyskusja na ten temat bez rozwiązania: http://permalink.gmane.org/gmane.comp.lang.scala.simple-build-tool/1622

+0

Zabrakło mi do tego jak dobrze dzisiaj. Even: object Main extends App {scala.tools.nsc.interpreter.ILoop.breakIf (true)} zawiesi się. – arya

Odpowiedz

4

więc wiem, jest to stara sprawa, ale jeśli REPL wisi, zastanawiam się, czy problem jest to, że you need to supply the -Yrepl-sync option? Kiedy mój osadzony REPL wisiał w podobnej sytuacji, rozwiązał to dla mnie.

Aby ustawić -Yrepl-sync w osadzonym REPL, zamiast korzystania breakIf musisz work with the ILoop directly, dzięki czemu można uzyskać dostęp do obiektu Settings:

// create the ILoop 
val repl = new ILoop 
repl.settings = new Settings 
repl.in = SimpleReader() 

// set the "-Yrepl-sync" option 
repl.settings.Yreplsync.value = true 

// start the interpreter and then close it after you :quit 
repl.createInterpreter() 
repl.loop() 
repl.closeInterpreter() 
+0

To rozwiązanie rzeczywiście sprawdziło się w przypadku problemu, który miał OP. W ten sposób możesz nawet napisać własne 'break' i' breakIf'. –

Powiązane problemy