2012-01-18 40 views
14

我不知道如何編寫代碼,將允許放入解釋器到斯卡拉2.9代碼。這個問題是一個後續this one,該問什麼斯卡拉當量,如何寫斯卡拉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。不幸的是,這裏調用的許多類/方法現在已經發生了變化,我不太確定如何修改代碼的行爲與「預期」相同。

謝謝!

編輯:這裏是我的測試代碼,這在目前的編譯和運行,但試圖在應用程序凍結,如果編譯通過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執行什麼:作爲我目前的設置正在運行,我發現這個主題已被涵蓋in the FAQ(頁面底部)。但是,我不明白給出的解釋,任何有關MyType的澄清將是無價的。

EDIT3:http://permalink.gmane.org/gmane.comp.lang.scala.simple-build-tool/1622

+0

我碰到這個問題,以及今晚。 Even:對象Main extends App {scala.tools.nsc.interpreter.ILoop.breakIf(true)}將掛起。 – arya

回答

4

所以我知道這是一個老問題,但如果你的REPL是掛,我想知道的問題是,you need to supply the -Yrepl-sync option:無解的話題討論的另一個?當我的嵌入式REPL掛在類似的情況下,爲我解決了它。

設置-Yrepl-sync在嵌入式REPL,而不是使用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

這個解決方案確實爲我解決了OP的問題。你甚至可以用這種方式編寫你自己的'break'和'breakIf'。 –