2012-07-09 19 views
12

स्कैला में एसबीटी टूलचैन का उपयोग करते समय, एक ऐसा कार्य लिखना संभव है जो संकलन समय पर स्कैला-कोड उत्पन्न करने के लिए प्रोजेक्ट के स्रोत का एक विशेष हिस्सा पढ़े।स्कैला

इस पर कोई विचार या यहां तक ​​कि लेख/ट्यूटोरियल? मैं टेम्पलेट हास्केल के समान कुछ ढूंढ रहा हूं।

+0

हाँ, यह संभव है। मुझे यकीन है कि प्लगइन हैं जो इसे करते हैं। क्या आपने मौजूदा प्लगइन की सूची देखी है? –

उत्तर

13

treehugger.scala एक पुस्तकालय कोड पीढ़ी के लिए बनाया गया है।

Apply(Ident(println),List(Literal(Constant(Hello, world!)))) 
println("Hello, world!") 

Treehugger एक एएसटी उत्पन्न करता है, लेकिन scalac के एएसटी को गैर-संगत:

import treehugger.forest._ 
import definitions._ 
import treehuggerDSL._ 

val tree: Tree = Predef_println APPLY LIT("Hello, world!") 

println(tree) 
println(treeToString(tree)) 

ऊपर कोड दो पंक्तियों प्रिंट करता है।

+5

बस स्पष्ट करने के लिए: treehugger = स्रोत कोड पीढ़ी; मैक्रोज़ = एएसटी पीढ़ी। पूर्व निचला तकनीक है, जो वास्तव में एक लाभ हो सकता है :) – retronym

+0

@EugeneYokota, क्या यह स्कैला 2.10 के लिए पास की रिलीज की योजना है? – jeslg

7

स्कैला 2.10 में मैक्रोज़ के लिए प्रयोगात्मक समर्थन है जो एक जैसे परिष्कृत संकलन-समय कोड जनरेशन है। अधिक जानकारी के लिए here देखें।

जेसन Zaugg के macrocosm Git भंडार पर कुछ मजेदार उदाहरण हैं, और SLICK पुस्तकालय जो ScalaQuery एसक्यूएल डीएसएल प्रकार-सुरक्षित डेटाबेस (और संग्रह) प्रश्नों को सक्षम करने का विकास है एक LINQ की तरह रास्ते में व्यक्त किया जा करने के लिए।

और यह उदाहरण के लिए, expecty अभिकथन पुस्तकालय से:

import org.expecty.Expecty 

case class Person(name: String = "Fred", age: Int = 42) { 
    def say(words: String*) = words.mkString(" ") 
} 

val person = Person() 
val expect = new Expecty() 

... 
val word1 = "ping" 
val word2 = "pong" 

expect { 
    person.say(word1, word2) == "pong pong" 
} 

पैदावार:

java.lang.AssertionError: 

person.say(word1, word2) == "pong pong" 
|  | |  |  | 
|  | ping pong false 
|  ping pong 
Person(Fred,42) 
+0

उन्हें पूर्ण सुविधा होने की उम्मीद कब है? – Lanbo

+1

मेरा मानना ​​है कि कंपाइलर विकास टीम 2.10 में उन्हें ट्रायल कर रही है यह देखने के लिए कि समुदाय उन्हें कितना उपयोगी बनाता है। वर्तमान सोच (आखिरी बार जब मैं आंतरिक मेलिंग सूची पढ़ रहा था, कुछ हफ्ते पहले) यह है कि वे अभी भी केवल प्रयोगात्मक होने की संभावना को खोल रहे हैं। लेकिन यदि सामुदायिक समर्थन बहुत सकारात्मक है तो मुझे लगता है कि उन्हें अपनाया जाएगा। इस साइट पर अन्य लोग हैं जो आपको एक और निश्चित उत्तर देने में सक्षम हो सकते हैं। –

+1

वे टेम्पलेट हास्केल की तरह बहुत अधिक दिखते हैं, और इसका व्यापक रूप से उपयोग किया जाता है। हालांकि कई मामलों के लिए स्काला इसके बिना अच्छी तरह से सेवा कर सकता है (जटिल कक्षाओं के लिए स्वचालित विस्तार की तरह)। लेकिन मेरे उद्देश्य के लिए, संकलन पर पूर्व प्रसंस्करण संपत्ति, यह उपयुक्त है। – Lanbo

4

मैंने हाल ही में कुछ शोध किया है। बहुत सारे विकल्प उपलब्ध हैं:

  1. स्ट्रिंग टेम्पलेट्स।
  2. Treehugger
  3. स्काला मैक्रो

अधिक यहाँ विवरण: http://yefremov.net/blog/scala-code-generation/