2012-12-12 25 views
72

मैं एक उदाहरण के साथ शुरू करूंगा। यहाँ स्काला 2.10 में मैक्रो के रूप में tuples के लिए List.fill के समतुल्य है:स्केलिंग 2.10 मैक्रोज़

import scala.language.experimental.macros 
import scala.reflect.macros.Context 

object TupleExample { 
    def fill[A](arity: Int)(a: A): Product = macro fill_impl[A] 

    def fill_impl[A](c: Context)(arity: c.Expr[Int])(a: c.Expr[A]) = { 
    import c.universe._ 

    arity.tree match { 
     case Literal(Constant(n: Int)) if n < 23 => c.Expr(
     Apply(
      Select(Ident("Tuple" + n.toString), "apply"), 
      List.fill(n)(a.tree) 
     ) 
    ) 
     case _ => c.abort(
     c.enclosingPosition, 
     "Desired arity must be a compile-time constant less than 23!" 
    ) 
    } 
    } 
} 

हम इस प्रकार इस विधि का उपयोग कर सकते हैं:

scala> TupleExample.fill(3)("hello") 
res0: (String, String, String) = (hello,hello,hello) 

यह आदमी मामलों के एक जोड़े में एक अजीब पक्षी है। सबसे पहले, arity तर्क एक शाब्दिक पूर्णांक होना चाहिए, क्योंकि हमें संकलन समय पर इसका उपयोग करने की आवश्यकता है। स्कैला के पिछले संस्करणों में एक विधि के लिए कोई रास्ता नहीं था (जहां तक ​​मुझे पता है) यह बताने के लिए कि क्या इसके तर्कों में से एक संकलन-समय शाब्दिक था या नहीं।

दूसरा, Product वापसी प्रकार is a lie-स्थिर रिटर्न प्रकार में ऊपर दिखाए गए अनुसार तर्कों द्वारा निर्धारित विशिष्ट धर्मार्थ और तत्व प्रकार शामिल होगा।

तो मैं इस बात को कैसे दस्तावेज करूं? मुझे इस बिंदु पर स्कालाडोक समर्थन की उम्मीद नहीं है, लेकिन मैं सम्मेलनों या सर्वोत्तम प्रथाओं (केवल यह सुनिश्चित करने के अलावा कि संकलन-समय त्रुटि संदेश स्पष्ट हैं) से परे एक मैक्रो विधि में चलना होगा - इसके साथ स्कैला 2.10 लाइब्रेरी के उपयोगकर्ताओं के लिए संभावित रूप से विचित्र मांग-कम आश्चर्यजनक।

नए मैक्रो सिस्टम (उदाहरण के लिए, ScalaMock, Slick, here सूचीबद्ध अन्य) के सबसे परिपक्व प्रदर्शन, अभी भी विधि स्तर पर अपेक्षाकृत अनियंत्रित हैं। किसी भी उदाहरण या पॉइंटर्स की सराहना की जाएगी, जिसमें समान मैक्रो सिस्टम वाली अन्य भाषाओं के अलावा शामिल हैं।

+12

स्कैलामोक के बारे में लेखक के रूप में, मैं इस बारे में सुझावों के लिए बहुत आभारी हूं कि मैं दस्तावेज़ीकरण में सुधार कैसे कर सकता हूं। ScalaMock प्रभावी रूप से एक डीएसएल है, इसलिए व्यक्तिगत तरीकों को दस्तावेज करना जरूरी नहीं है। मैंने डीएसएल को यहां पूरी तरह से दस्तावेज करने की कोशिश की है: http://scalamock.org/api/index.html#org.scalamock.package और यहां प्रलेखन शुरू हो रहा है: http://www.paulbutcher.com/2012/10/scalamock3-step-by-step/मैं क्या जोड़ सकता हूं जो मदद करेगा? –

+2

@PaulButcher: मेरा मतलब ScalaMock की आलोचना करने का नहीं है, और मैंने यह स्पष्ट करने के लिए उत्तर संपादित किया है। मैंने आपके कोड को बेहद उपयोगी पढ़ा है क्योंकि मैं स्कैला के मैक्रोज़ को समझने की कोशिश कर रहा हूं, और मुझे लगता है कि उच्च स्तरीय दस्तावेज बहुत स्पष्ट है। –

+8

कोई अपराध नहीं लिया गया। लेकिन मैं निश्चित रूप से उन तरीकों के लिए किसी भी और सभी सुझावों की सराहना करता हूं जिनमें मैं सुधार कर सकता हूं। –

उत्तर

1

मुझे लगता है कि इन्हें दस्तावेज करने का सबसे अच्छा तरीका उदाहरण कोड के साथ है, क्योंकि माइल्स अपने प्रायोगिक macro based branch आकारहीन में कर रहा है।