2012-02-17 26 views
6

Tôi có một vấn đề với scala.tools.sbtScala SBT: scala.tools.nsc không chạy

tập tin scala

Ở đây tôi sử dụng chức năng phân tích cú pháp để làm cho cây cú pháp trừu tượng của đang 2 + 3 cấu hình

import scala.tools.nsc._ 
object Main extends App { 
    var i = new Interpreter 
    println(i.parse("2 + 3")) 
} 

SBT

name := "scalaSample" 

version := "1.0-SNAPSHOT" 

scalaVersion := "2.9.1" 

libraryDependencies += "org.scalatest" %% "scalatest" % "1.7.1" % "test" 

libraryDependencies += "org.scala-lang" % "scala-compiler" % "2.9.1" 

Lỗi

Không thể khởi biên dịch: không tìm thấy đối tượng scala. ** Lưu ý rằng khi 2.8 scala không giả sử sử dụng classpath java. ** Đối với hành vi cũ vượt qua -usejavacp để scala, hoặc nếu sử dụng một cài đặt ** đối tượng programatically, settings.usejavacp.value = true.

[lỗi] (chạy chính) java.lang.NullPointerException java.lang.NullPointerException tại scala.tools.nsc.CompilationUnits $ CompilationUnit. (CompilationUnits.scala: 16) tại scala.tools.nsc.interpreter.ExprTyper $ codeParser $ .applyRule (ExprTyper.scala: 22) tại scala.tools.nsc.interpreter.ExprTyper $ codeParser $ .stmts (ExprTyper .scala: 36) tại scala.tools.nsc.interpreter.ExprTyper $$ anonfun $ parse $ 2.apply (ExprTyper.scala: 47) tại scala.tools.nsc.interpreter.ExprTyper $$ anonfun $ parse $ 2 .apply (ExprTyper.scala: 46) tại scala.tools.nsc.reporters.Reporter.withIncompleteHandler (Reporter.scala: 46) tại scala.tools.nsc.interpreter.ExprTyper $ class.parse (ExprTyper.scala : 46) tại scala.tools.nsc.interpreter.IMain $ exprTyper $ .parse (IMain.scala: 1012) tại scala.tools.nsc.interpreter.IMain.parse (IMain.scala: 1013) tại eu.semantiq.scalaToJS.Main $ delayInit $ body.apply (Chính. scala: 7) tại scala.Function0 $ class.apply $ mcV $ sp (Function0.scala: 34) tại scala.runtime.AbstractFunction0.apply $ mcV $ sp (AbstractFunction0.scala: 12) tại scala.App $ $ anonfun $ chính $ 1.apply (App.scala: 60) tại scala.App $$ anonfun $ chính $ 1.apply (App.scala: 60) tại scala.collection.LinearSeqOptimized $ class.foreach (LinearSeqOptimized.scala: 59) tại scala.collection.immutable.List.foreach (List.scala: 45) tại scala.collection.generic.TraversableForwarder $ class.foreach (TraversableForwarder.scala: 30) tại scala.App $ class.main (App.scala: 60) lúc eu.semantiq.scalaToJS.Main $ .main (Main.scala: 5) tại eu.semantiq.scalaToJS.Main.main (Main.scala) tại sun.reflect.NativeMethodAccessorImpl.invoke0 (Phương pháp gốc) tại mặt trời .reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) tại sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) tại java.lang.reflect.Method.invoke (Method.java:616) java .lang.RuntimeException: Mã thoát Nonzero: 1 tại scala.sys.package $ .error (gói.scala: 27)

Trong scala REPL mọi thứ hoạt động

Chào mừng bạn đến Scala phiên bản 2.9.0.1 (OpenJDK 64-Bit Server VM, Java 1.6.0_23 ). Nhập các biểu thức để chúng được đánh giá. Loại: trợ giúp để biết thêm thông tin.

scala>nhập khẩu scala.tools.nsc._

nhập khẩu scala.tools.nsc._

scala>var i = new Interpreter

cảnh báo: đã có 4 phản đối cảnh báo; chạy lại với -deprecation để biết chi tiết cảnh báo: đã có 1 cảnh báo ngừng sử dụng; tái chạy với -deprecation để biết chi tiết

i: scala.tools.nsc.Interpreter = [email protected]

scala>println (i.parse ("2 + 3"))

Một số (Danh sách (2. $ cộng (3)))

tôi cảm thấy thực sự xin lỗi cho tiếng Anh xấu của tôi

Trả lời

4

Theo để xsbt của FAQ:

SBT chạy thử nghiệm trong JVM giống như SBT bản thân và các lớp học Scala không trong bộ nạp lớp giống như các lớp ứng dụng.

Và có nhiều:

Điều quan trọng là để khởi tạo cài đặt cho trình biên dịch sử dụng embeddedDefaults.

Ví dụ được cung cấp ở đó sử dụng một số loại tùy ý MyType. Trong thực tế, bạn có thể sử dụng bất kỳ loại nào của bạn để giúp sbt tìm trình nạp lớp thích hợp (xem this answer).

Do đó, mã của bạn sẽ như sau:

import scala.tools.nsc._ 

trait Foo // Arbitrary type added to get stuff working 

object Main extends App { 
    val settings = new Settings 
    settings.embeddedDefaults[Foo] 
    val interpreter = new Interpreter(settings) 
    println(interpreter.parse("2 + 3")) 
} 
Các vấn đề liên quan