Как написать код Scala 2.9, который позволит зайти в интерпретатор - PullRequest
14 голосов
/ 19 января 2012

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

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

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

Спасибо!

РЕДАКТИРОВАТЬ: Здесьмой тестовый код, который в настоящий момент компилируется и запускается, но попытка выполнить что-либо в отладчике приводит к зависанию приложения, если оно скомпилировано в 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, я обнаружил, что эта тема покрыта в FAQ (внизу страницы).Однако я не понимаю данное объяснение, и любые разъяснения по MyType были бы неоценимы.

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

1 Ответ

4 голосов
/ 09 ноября 2012

Так что я знаю, что это старый вопрос, но если ваш REPL зависает, мне интересно, если проблема в том, что вам нужно предоставить опцию -Yrepl-sync ?Когда мой встроенный REPL завис в аналогичной ситуации, это решило его для меня.

Чтобы установить -Yrepl-sync во встроенном REPL, вместо использования breakIf вам нужно будет работать сILoop напрямую , чтобы вы могли получить доступ к объекту 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()
...