2013-07-01 7 views
12

मैंने अभी देखा है कि स्कैला में मैक्रोज़ हैं, लेकिन मैंने कभी भी ऐसा कोई कोड नहीं देखा है जो उनका उपयोग करता है। वे सी प्रीप्रोसेसर मैक्रोज़ और इसी तरह से काफी अलग दिखते हैं। मैक्रोज़ के overview के माध्यम से पढ़ना, ऐसा लगता है कि वे ऐसा कुछ भी नहीं देते जो स्कैला में पहले संभव नहीं था। ,स्कैला मैक्रोज़, उनका उपयोग कहां किया जाता है?

  • भाषा वर्चुअलाइजेशन (अधिक भार/ मूल प्रोग्रामिंग भाषा के शब्दों अधिभावी DSLs की गहरी एम्बेडिंग सक्षम करने के लिए)
  • कार्यक्रम reification (: प्रेरणा शीर्षक के अंतर्गत, वहाँ चीजें हैं जो मैक्रो सक्षम की एक सूची है साधनों के साथ कार्यक्रमों को उपलब्ध कराने के उनके खुद कोड),
  • स्व अनुकूलन (डोमेन-विशिष्ट अनुकूलन कार्यक्रम reification) के आधार पर की आत्म आवेदन, निरीक्षण करने के लिए
  • एल्गोरिथम कार्यक्रम निर्माण (कोड की पीढ़ी जो प्रोग्रामिंग भाषा द्वारा समर्थित अबास्ट्रक्शन के साथ लिखने के लिए कठिन है)।

बाद में मेनू में, इस तरह के प्रकार मैक्रो, quasiquotes, untyped मैक्रो और भी अधिक के रूप में प्रयोगात्मक मैक्रो सुविधाओं, कर रहे हैं। स्पष्ट रूप से इसकी मांग है!

ये सभी लोगों के लिए अच्छी सुविधाएं लगते हैं जो स्केल की मजबूत समझ के साथ बहुत परिष्कृत पुस्तकालयों का निर्माण करते हैं। लेकिन क्या मैक्रोज़ औसत स्कैला डेवलपर के लिए भी कुछ ऑफर करते हैं? मैक्रोज़ का उपयोग करके मेरा स्कैला कोड बेहतर होगा?

+1

आपको लगता है कि रूपरेखा मैक्रो की दिलचस्प प्रयोगों में से कुछ हमारे नवीनतम कागज पर एक नज़र ले जा सकते हैं: http://scalamacros.org/ paperstalks/2013-04-22-LetOurPowersCombine.pdf। –

+0

यहां एक समर्पित दस्तावेज़ साइट आलेख है: http://docs.scala-lang.org/overviews/macros/usecases.html –

उत्तर

17

"औसत" स्कैला डेवलपर के रूप में, संभवतः आप मैक्रोज़ लिखने की संभावना नहीं रखते हैं, जब तक कि आपके पास बहुत अच्छा कारण न हो।

मैक्रोज़ समय मेटा प्रोग्रामिंग संकलित करने का एक तरीका है, जो आपको प्रोग्राम प्रोग्राम कहता है। उदाहरण के लिए, एक डीफ-मैक्रो- जो स्कैला 2.10 का हिस्सा है, फिर भी "प्रायोगिक" - नियमित विधि की तरह दिखता है, लेकिन जब भी आप अपने कोड में उस विधि को कॉल करते हैं, तो संकलक उस विधि को उस विधि के पीछे छुपाए हुए मैक्रो के साथ उस कॉल को प्रतिस्थापित करेगा उत्पादन करेगा (एक नया कोड खंड)।


एक बहुत ही सरल उदाहरण। तारीख को शामिल जब अपनी परियोजना कोड में संकलित किया गया था:

import java.util.Date 
import reflect.macros.Context 
import language.experimental.macros 

object CompileTime { 
    def apply(): Date = macro applyImpl 

    def applyImpl(c: Context)(): c.Expr[Date] = { 
    import c.universe._ 
    val now  = System.currentTimeMillis() // this is executed during compilation! 
    val nowExpr = c.Expr[Long](Literal(Constant(now))) 
    val code = reify(new Date(nowExpr.splice)) 
    c.Expr(code.tree) 
    } 
} 

कि मैक्रो का उपयोग करना (निम्नलिखित कोड अलग संकलित किया जाना चाहिए ऊपर मैक्रो कोड से):

object MacroTest extends App { 
    println(s"This project was compiled on ${CompileTime()}") 
} 

(आप चलाते हैं कई बार, आप देखते हैं कि संकलन समय वास्तव में स्थिर है)


तो संक्षेप में, मैक्रोज़ एक कार्यक्षमता प्रदान करते हैं जो किसी भी पिछले स्कैला संस्करण में उपलब्ध नहीं था। आप मैक्रोज़ के साथ चीजें कर सकते हैं जो आप अन्यथा नहीं कर सकते हैं (अक्सर आप रनटाइम प्रतिबिंब का उपयोग करके समान चीजें लिख सकते हैं, लेकिन मैक्रोज़ संकलन समय पर चेक किए जाते हैं)।

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

कुछ यादृच्छिक लिंक

+1

कई लॉगिंग और क्रमबद्ध पुस्तकालय दृश्यों के पीछे मैक्रोज़ का उपयोग करते हैं। – Andy

संबंधित मुद्दे