2011-03-05 10 views
11

Scala'da yazılar yazılabilir. Yani Hello.scalaSenaryoyu yürütmeden ve herhangi bir sınıf dosyası oluşturmadan Scala komut dosyasını nasıl kontrol edebilirim?

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

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

bu koymak ve

chmod u+x Hello.scala 

tarafından Unix içinde çalıştırılabilir hale Sonra

./Hello.scala 

Bu senaryoyu derler ve basitçe komut dosyasını çalıştırın can sözdizimi hatası yoksa çalışır. Ancak, bu, yalnızca betik yürütme olmadan sözdizimi yapmak istediğimde durumu dikkate almaz. Komut dosyasını değiştirmek istemiyorum (yani #! Yönergesini kaldırarak) ve herhangi bir * .class dosyasının oluşturulmasını istemiyorum.

Scala betiğini nasıl kontrol edebilirim?

+0

Yalnızca sözdizimini kontrol etmek, dil özelliğinde verilen dilbilgisini kullanarak ANTLR gibi araçlarla temel ayrıştırıcı oluşturarak muhtemelen en kolay şekilde yapılır. İsim ve tip kontrolü yapmak ister misiniz? Eğer öyleyse, işler dağınık olur ve muhtemelen scalac ile doğrudan çalışmak istersiniz. – Raphael

+0

Sorumlulukta kesin değildim. Yazım denetimi yanı sıra sözdizimi denetimi gerçekleştirmek istiyorum ve Scala derleyici/altyapı kullanmak istiyorum. Aşağıdaki milin cevabı sağda. – midinastasurazz

cevap

22

Doğru sözdizimini kontrol etmekten biraz daha fazlasını isteyeceğinizi umuyorum ... muhtemelen bilmek istediğiniz şey, dosyanızı gerçekten derlediyseniz, dosyanızın doğru şekilde derlenmesidir. Bu, sözdizimi denetimi yanı sıra tip denetimi içerir.

Scala kaynak dosyaları için (örn. Komut dosyaları değil), derleyici kod oluşturmaya başlamadan önce durması için -Ystop: refchecks komut satırı bağımsız değişkenini belirtebilirsiniz (gerçekten yalnızca belirttiğiniz sözdizimsel doğrulukla ilgileniyorsanız) ýstöp: ayrıştırıcı). Hatalar varsa, konsolda, kaynakları tam olarak derlediyseniz, tam olarak aynı şekilde gösterilecektir.

Scala komut dosyaları için -Ystop: refchecks argümanı da belirtebilirsiniz. Bunu yaparsanız, o zaman konsolda bildirilen hataları derleme bakın veya komut dosyası hiç hata varsa, aşağıdakileri göreceksiniz

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

hiçbir classfiles üretildiğini belirten ClassNotFoundException ve edecek ya komut dosyanızın yürütülemediğini.

+0

Güzel cevap - bugün yeni bazı hileler öğrendim. Teşekkürler. – Janx

+0

Mükemmel cevap. Yorumun doğru. Gerçekten derlediysem, dosyanın doğru bir şekilde derlenip çoğalmayacağını bilmek istiyorum. Teşekkürler. – midinastasurazz

+0

Bu hala geçerli mi? Scala ile çalışmıyor gibi görünüyor. Bu konuda aramada herhangi bir bilgi bulunamıyor. Teşekkürler. –

0

tercümana geçmek dosyanızın kapalı hatları kesmek isterseniz, CutScala.scala adlı bir komut dosyası oluşturabilir (veya tercih ne olursa olsun):

#!/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 
} 

ve sonra

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

, ilk 4 satırı bırakmak ve geri kalanını ayrıştırmak için. Miles'ın cevabı size herhangi bir çıktı üretmeme ve hiçbir şey yapmamanın ötekini (daha zor) nasıl yapacağınızı söyler.

+1

Vay! O kadar basit bir şey yerine, 'awk' NR> 4 '' ... –

+1

@Elazar Leibovich - Veya 'tail -n + 4' gibi bir çok scala yaygara. Sorun şu ki, Scala betiği yorumcusu AIMICT'nin stdin almayacağı ve bir komutun değiştirilmesini sağlam bir şekilde önlemekten kaçınamayacağınız, böylece metnin '-e' içine işlenmesiyle ilgili nispeten önemsiz girişimlerin işe yaramadığıdır. –

+0

'cat $ 1 | awk 'NR> 4'> /tmp/tmp.$1 && scalac /tmp/tmp.$1; rm/tmp/tmp. $ 1' veya tamlık adına benzersiz dosya adı oluşturmak için biraz daha karmaşık bir yol. Ancak önemsiz görevler için çok fazla kod, bunun iş için yanlış bir araç olduğunu kanıtlıyor. Ayrıca, betik ve "scala" için iki kez JVM başlangıç ​​zamanları geçirmeniz gerektiğini düşünün. –

İlgili konular