2012-01-18 2 views
14

Я не уверен, как написать код, который позволит отказаться от интерпретатора в Scala 2.9. Этот вопрос является продолжением до this one, который спросил, что Scala эквивалент,Как написать Scala 2.9 код, который позволит отказаться от интерпретатора

import pdb 
pdb.set_trace() 

был из Python. Рекомендации, приведенные там, были в основном для Scala 2.8, и соответствующие пакеты больше не существуют в их предыдущем виде. А именно,

  1. scala.nsc.tools.nsc.Interpreter.{break, breakIf} были перемещены в scala.nsc.tools.nsc.interpreter.ILoop.{break, breakIf}
  2. DebugParam теперь NamedParam в scala.tools.nsc.interpreter

Как отмечалось в исходное сообщение, класс путь родительского процесса автоматически не передавался новому интерпретатору, поэтому было представлено обходное решение here. К сожалению, многие из вызванных там классов/методов изменились, и я не совсем уверен, как изменить код, который ведет себя как «ожидаемый».

Спасибо!

EDIT: Вот мой тестовый код, который в настоящее время компилируется и работает, но пытается выполнить что-либо в результатах отладчика в приложении замораживания, если составитель scalac и выполняется 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: Как моя текущая настройка работает через sbt, я обнаружил, что этот раздел покрыт in the FAQ (внизу страницы). Тем не менее, я не понимаю объяснения, и любые разъяснения на MyType были бы неоценимы.

EDIT3: другое обсуждение на тему без решения: http://permalink.gmane.org/gmane.comp.lang.scala.simple-build-tool/1622

+0

Я столкнулся с этим, а сегодня. Even: object Main extends Приложение {scala.tools.nsc.interpreter.ILoop.breakIf (true)} будет зависать. – arya

ответ

4

Так что я знаю, что это старый вопрос, но если ваш РЕПЛ висит, я задаюсь вопросом, если проблема заключается в том, что you need to supply the -Yrepl-sync option? Когда мой встроенный REPL висел в подобной ситуации, это решило его для меня.

Чтобы установить -Yrepl-sync во встроенном РЕПЛ, вместо того, чтобы использовать breakIf вам нужно work with the ILoop directly так что вы можете получить доступ к 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

Это решение действительно помогло мне в решении этой проблемы. Вы можете даже написать свой собственный 'break' и' breakIf' таким образом. –

Смежные вопросы