Как я могу синтаксис проверить Scala script без выполнения script и генерации любых файлов классов?

Можно писать сценарии в Scala. Поэтому вы можете поместить это в Hello.scala

#!/bin/sh
exec scala $0 [email protected]
!#

println("You supplied " + args.length + " arguments!")

и сделать его исполняемым в Unix с помощью

chmod u+x Hello.scala

Затем вы можете запустить script просто

./Hello.scala

Скомпилирует script и запускает его, если нет синтаксических ошибок. Однако это не учитывает ситуацию, когда я хочу только синтаксическую проверку без выполнения script. Я не хочу изменять script (т.е. Удаляя директиву #!), И я не хочу, чтобы генерировались *.class файлы.

Как я могу синтаксис проверить Scala script?

Ответ 1

Я ожидаю, что вы действительно хотите немного больше, чем просто проверить правильный синтаксис... предположительно, что вы хотите знать, так это то, что ваш файл будет правильно скомпилирован, если вы действительно его скомпилируете. Это включает проверку типов, а также проверку синтаксиса.

Для исходных файлов Scala (т.е. не скриптов) вы можете указать аргумент командной строки -Ystop: refchecks, чтобы заставить компилятор остановиться до начала генерации кода (если вас действительно интересует только синтаксическая корректность, которую вы можете указать -Ystop: синтаксический анализатор). Если есть ошибки, они будут показаны на консоли точно так же, как если бы вы полностью скомпилировали источники.

Для скриптов Scala вы также можете указать аргумент -Ystop: refchecks. Если вы это сделаете, вы либо увидите ошибки компиляции, сообщаемые на консоли, либо, если в script нет ошибок, вы увидите следующее:

$ scala -Ystop:refchecks Hello.scala 
java.lang.ClassNotFoundException: Main

Класс ClassNotFoundException, указывающий, что не созданы файлы классов и что ваш script не был выполнен.

Ответ 2

Если вы хотите вырезать строки с вашего файла, чтобы перейти к интерпретатору, вы можете создать script под названием CutScala.scala (или что бы вы ни выбрали):

#!/bin/sh
exec scala $0 [email protected]
!#

import scala.collection.JavaConversions._
import java.io._

val p = new ProcessBuilder(
  List(
    "scala",
    "-e",
    io.Source.fromFile(args(1)).getLines().drop(args(0).toInt).mkString("\n")
  ) :::
  args.drop(2).toList
).start()

p.waitFor

val output = List(p.getInputStream,p.getErrorStream).map(
  x => new BufferedReader(new InputStreamReader(x))
)

println("Exit code = " + p.exitValue)
for ((reader,title) <- (output zip List("Output:","Errors:"))) {
  println(title);
  Iterator.continually(reader.readLine).takeWhile(_!=null).foreach(println)
  println
}

а затем назовите его как

./CutScala.scala 4 Hello.scala a b c

чтобы удалить первые 4 строки и просто проанализировать остальные. Ответ Майлза говорит вам, как делать другую (более сложную) половину, не производя никакого вывода и ничего не запускать.