2012-01-18 5 views
14

Tôi không chắc chắn cách viết mã cho phép thả vào trình thông dịch thành mã Scala 2.9. Câu hỏi này là theo dõi tới this one, yêu cầu tương đương Scala là gì,Cách viết mã Scala 2.9 sẽ cho phép rơi vào thông dịch viên

import pdb 
pdb.set_trace() 

là từ Python. Lời khuyên được đưa ra có chủ yếu cho Scala 2.8, và các gói liên quan không còn tồn tại ở dạng trước của chúng. Cụ thể,

  1. scala.nsc.tools.nsc.Interpreter.{break, breakIf} đã được chuyển đến scala.nsc.tools.nsc.interpreter.ILoop.{break, breakIf}
  2. DebugParam hiện NamedParam trong scala.tools.nsc.interpreter

Như đã đề cập trong các bài bản gốc, các đường dẫn lớp của quá trình cha mẹ là không được chuyển tới thông dịch viên mới một cách tự động, do đó giải pháp được trình bày here. Rất tiếc, nhiều lớp/phương thức được gọi hiện đã thay đổi và tôi không chắc chắn cách sửa đổi mã hoạt động như "mong đợi".

Cảm ơn!

EDIT: Đây là mã thử nghiệm của tôi, mà lúc biên dịch hiện tại và chạy, nhưng cố gắng để thực hiện bất cứ điều gì trong các kết quả gỡ lỗi trong ứng dụng đóng băng nếu biên soạn bởi scalac và thực hiện bởi 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: Như thiết lập hiện tại của tôi đang chạy qua sbt, tôi đã phát hiện ra rằng chủ đề này được che phủ in the FAQ (dưới cùng của trang). Tuy nhiên, tôi không hiểu những lời giải thích được đưa ra, và bất kỳ làm rõ trên MyType sẽ là vô giá.

EDIT3: một cuộc thảo luận về chủ đề này mà không có một giải pháp: http://permalink.gmane.org/gmane.comp.lang.scala.simple-build-tool/1622

+0

tôi đã chạy vào này là tốt tối nay. Ngay cả: đối tượng Chính mở rộng App {scala.tools.nsc.interpreter.ILoop.breakIf (true)} sẽ bị treo. – arya

Trả lời

4

Vì vậy, tôi biết đây là một câu hỏi cũ, nhưng nếu REPL của bạn được treo, tôi tự hỏi, nếu vấn đề là you need to supply the -Yrepl-sync option? Khi REPL nhúng của tôi bị treo trong một tình huống tương tự, điều đó đã giải quyết nó cho tôi.

Để thiết -Yrepl-sync trong một REPL nhúng, thay vì sử dụng breakIf bạn sẽ cần phải work with the ILoop directly để bạn có thể truy cập vào đối tượng 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

Giải pháp này thực sự đã làm việc cho tôi vì vấn đề mà OP có. Bạn thậm chí có thể viết 'break' và' breakIf' của riêng bạn theo cách này. –