2011-03-05 7 views
11

कोई स्कैला में स्क्रिप्ट लिख सकता है। तो तुम स्क्रिप्ट निष्पादित किए बिना और किसी भी वर्ग फ़ाइलों को उत्पन्न किए बिना मैं स्कैला स्क्रिप्ट को कैसे सिंटैक्स कर सकता हूं?

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

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

Hello.scala

में डाल और द्वारा

chmod u+x Hello.scala 

यह यूनिक्स में निष्पादन योग्य बना सकते हैं तो फिर तुम से

./Hello.scala 

यह स्क्रिप्ट संकलित करता है तथा बस स्क्रिप्ट चला सकते हैं अगर कोई वाक्यविन्यास त्रुटियां नहीं हैं तो इसे चलाता है। हालांकि, यह स्थिति के लिए जिम्मेदार नहीं है जब मैं केवल को स्क्रिप्ट निष्पादित किए बिना सिंटैक्स जांचना चाहता हूं। मैं स्क्रिप्ट को संशोधित नहीं करना चाहता (यानी #! निर्देश को हटाकर) और मैं नहीं चाहता कि * .class फ़ाइलों को उत्पन्न किया जाए।

मैं स्कैला स्क्रिप्ट की जांच कैसे कर सकता हूं?

+0

सिंटैक्स की जांच करना संभवतः भाषा स्पेक में दिए गए व्याकरण का उपयोग करके एएनटीएलआर जैसे उपकरणों के साथ मूल पार्सर बनाकर सबसे आसान किया जाता है। क्या आप नाम और टाइपिंग जांच भी करना चाहते हैं? यदि ऐसा है, तो चीजें गन्दा हो जाती हैं और आप शायद स्केलैक के साथ (भागों) के साथ काम करना चाहते हैं। – Raphael

+0

मैं अपने प्रश्न में सटीक नहीं था। मैं वाक्यविन्यास जांच के साथ-साथ टाइपिंग जांच करना चाहता हूं और मैं स्कैला कंपाइलर/आधारभूत संरचना का उपयोग करना चाहता हूं। नीचे माइल्स का जवाब बटन पर सही है। – midinastasurazz

उत्तर

22

मुझे उम्मीद है कि आप वास्तव में सही वाक्यविन्यास की जांच करने से थोड़ा अधिक चाहते हैं ... संभवतः आप जो जानना चाहते हैं वह यह है कि यदि आप वास्तव में इसे संकलित करते हैं तो आपकी फ़ाइल सही ढंग से संकलित होगी। इसमें टाइपिंग के साथ-साथ सिंटैक्स जांच शामिल है।

स्कैला स्रोत फ़ाइलों (यानी स्क्रिप्ट नहीं) के लिए आप -Ystop निर्दिष्ट कर सकते हैं: कोड जनरेशन शुरू करने से पहले संकलक को रोकने के लिए कमांड लाइन तर्क को रीफ्रैक करता है (यदि आप वास्तव में केवल सिंटैक्टिक शुद्धता में रुचि रखते हैं जो आप निर्दिष्ट कर सकते हैं - Ystop: पार्सर)। यदि त्रुटियां हैं तो वे कंसोल पर उसी तरह दिखाए जाएंगे जैसे कि आपने स्रोतों को पूरी तरह से संकलित किया है।

स्कैला स्क्रिप्ट के लिए आप -Ystop भी निर्दिष्ट कर सकते हैं: तर्क को रीफ्रैक करता है। यदि आप ऐसा करते हैं, तो आप या तो देखेंगे कंसोल पर सूचना दी त्रुटियों संकलन या, अगर वहाँ स्क्रिप्ट में कोई त्रुटि नहीं है, तो आप निम्नलिखित देखेंगे,

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

ClassNotFoundException यह दर्शाता है कि कोई classfiles उत्पन्न किया गया है और कि आपकी स्क्रिप्ट निष्पादित नहीं की गई है।

+0

अच्छा जवाब - आज कुछ नई चाल सीखा। धन्यवाद। – Janx

+0

उत्कृष्ट जवाब। आपकी व्याख्या सही है। मैं जानना चाहता हूं कि फ़ाइल वास्तव में संकलित करेगी अगर मैंने वास्तव में इसे संकलित किया था। धन्यवाद। – midinastasurazz

+0

क्या यह अभी भी वैध है? स्केल 2.9 के साथ काम नहीं लग रहा है। किसी खोज में इस पर कोई जानकारी नहीं मिल रही है। धन्यवाद। –

0

आप अपनी फ़ाइल बंद लाइनों में कटौती करने के लिए दुभाषिया को पास करना चाहते हैं, तो आप एक स्क्रिप्ट 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 लाइनों को छोड़ने और बाकी को पार्स करने के लिए। माइल्स का जवाब आपको बताता है कि किसी भी आउटपुट का उत्पादन न करने और कुछ भी नहीं चलने के दूसरे (अधिक कठिन) आधे को कैसे करना है।

+1

वाह! 'Awk' एनआर> 4'' के रूप में सरल कुछ के बजाय इतना scala झगड़ा ... –

+1

@Elazar Leibovich - या 'tail -n + 4'। समस्या यह है कि एएफएआईसीटी स्कैला स्क्रिप्ट दुभाषिया stdin नहीं लेगा, और आप एक कमांड प्रतिस्थापन टोकनिंग से मजबूती से नहीं बच सकते हैं, ताकि टेक्स्ट को '-e' में भरने के अपेक्षाकृत मामूली प्रयास काम न करें। –

+0

'बिल्ली $ 1 | awk 'एनआर> 4'> /tmp/tmp.$1 && scalac /tmp/tmp.$1; आरएम/टीएमपी/टीएमपी $ 1' या पूर्णता के लिए अद्वितीय फ़ाइल नाम उत्पन्न करने के लिए थोड़ा और अधिक परिष्कृत तरीका। लेकिन एक छोटे से कार्यों के लिए इतना कोड मुझे साबित करता है कि यह नौकरी के लिए गलत उपकरण है। यह भी मान लें कि आपको स्क्रिप्ट के लिए और 'स्कैला' के लिए JVM स्टार्टअप बार दो बार भुगतना होगा। –