अपाचे ग्रूवी: Difference between revisions
(→करी) |
|||
| Line 205: | Line 205: | ||
==== करी ==== | ==== करी ==== | ||
आमतौर पर आंशिक आवेदन कहा जाता है,<ref name=":0">[http://programmers.stackexchange.com/questions/152868/does-groovy-call-partial-application-currying "Does groovy call partial application 'currying']", 10 Aug 2013</ref> यह ग्रूवी फीचर क्लोजर के | आमतौर पर आंशिक आवेदन कहा जाता है,<ref name=":0">[http://programmers.stackexchange.com/questions/152868/does-groovy-call-partial-application-currying "Does groovy call partial application 'currying']", 10 Aug 2013</ref> यह ग्रूवी फीचर क्लोजर के मापदंडों को उनके किसी भी तर्क में व्यतिक्रम मापदंडों पर सेट करने की अनुमति देता है, जिससे बाउंड वैल्यू के साथ एक नया क्लोजर बनता है। को एक तर्क देना <code>curry()</code> विधि तर्क एक को ठीक करेगी। एन तर्क देने से तर्क 1 ठीक हो जाएगा ... एन। | ||
<वाक्यविन्यास लैंग = ग्रूवी> | <वाक्यविन्यास लैंग = ग्रूवी> | ||
Revision as of 08:33, 22 December 2022
| File:Groovy-logo.svg Groovy Logo | |
| Paradigm | Multi-paradigm: object-oriented, imperative, functional, aspect-oriented, scripting |
|---|---|
| द्वारा डिज़ाइन किया गया | James Strachan |
| Developer | Guillaume Laforge (PMC Chair) Jochen Theodorou (Tech Lead) Paul King Cedric Champeau |
| पहली प्रस्तुति | 2003 |
| Preview release | 4.0.0-beta-1
/ September 6, 2021[1] |
| टाइपिंग अनुशासन | Dynamic, static, strong, duck |
| प्लेटफॉर्म | Java SE |
| लाइसेंस | Apache License 2.0 |
| फ़ाइल नाम एक्सटेंशनएस | .groovy, .gvy, .gy, .gsh[2] |
| Major implementations | |
| Gradle, Grails | |
| Influenced by | |
| Java, Python, Ruby, Smalltalk | |
| Influenced | |
| Kotlin | |
अपाचे ग्रूवी जावा (प्रोग्रामिंग भाषा) - प्लेटफॉर्म के लिए जावा-रचनाक्रम-संगत वस्तु अभिमुखित प्रोग्रामन भाषा है। यह एक स्थिर और गतिशील भाषा दोनों है, जिसमें पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा), और स्मॉलटाक जैसी विशेषताएं हैं। इसे जावा प्लेटफॉर्म के लिए प्रोग्रामन भाषा और लिपिबद्धन भाषा दोनों के रूप में उपयोग किया जा सकता है, तथा इसे जावा आभासी मशीन (जेवीएम) बाईटकोड में संकलित किया जा सकता है, और अन्य जावा कोड और पुस्तकालयों (कम्प्यूटिंग) के साथ सहजता से अंतर्संचालन किया जा सकता है। ग्रूवी जावा के समान एक धनु कोष्ठक रचनाक्रम का उपयोग करता है। ग्रूवी संवरक (कंप्यूटर प्रोग्रामिंग), बहु श्रृंखला और श्रृंखला में अंतः स्थापित अभिव्यक्ति का समर्थन करता है। ग्रूवी की अधिकांश शक्ति इसके एएसटी रूपांतरणों में निहित है, जो एनोटेशन (टिप्पणी) के माध्यम से प्रवर्तित होती है।
ग्रूवी 1.0 को 2 जनवरी, 2007 को और ग्रूवी 2.0 को जुलाई, 2012 में प्रकाशित किया गया था। संस्करण 2 के बाद से, ग्रूवी को स्थिर रूप से संकलित किया जा सकता है, जो जावा के निकट प्रकार के अनुमान और प्रदर्शन की पेशकश करता है।[3][4] निर्णायक सॉफ्टवेयर के प्रायोजन के तहत ग्रूवी 2.4 अंतिम प्रमुख प्रकाशन था जो मार्च 2015 में समाप्त हो गया।[5] ग्रूवी ने तब से अपाचे सॉफ्टवेयर संस्था में एक परियोजना प्रबंधन समिति के लिए अपनी शासन संरचना को बदल दिया है।[6]
इतिहास
जेम्स स्ट्रेचन (प्रोग्रामर) ने पहली बार अगस्त 2003 में अपने ब्लॉग पर ग्रूवी के विकास के बारे में बात की थी।[7] मार्च 2004 में, ग्रूवी को, जेसीपी को जेएसआर 241[8] के रूप में प्रस्तुत किया गया और मतपत्र द्वारा स्वीकार किया गया थ। 2004 और 2006 के बीच कई संस्करण प्रकशित किए गए। जावा सामुदायिक प्रक्रिया (जेसीपी) मानकीकरण के प्रयास शुरू होने के बाद, संस्करण क्रमांकन बदल गया, और 1.0 नामक एक संस्करण 2 जनवरी, 2007 को प्रकशित किया गया। 7 अक्टूबर, 2007 को विभिन्न बीटा और प्रकशित उम्मीदवारों की संख्या 1.1 के बाद, ग्रूवी 1.1 अंतिम जारी किया गया था और किए गए कई बदलावों को प्रतिबिंबित करने के लिए तुरंत ग्रूवी 1.5 के रूप में पुन: नामित किया गया था।
2007 में, ग्रूवी ने जेएएक्स 2007 नवीनीकरण पुरस्कार में पहला पुरस्कार जीता।[9] 2008 में, ग्रेल्स, एक ग्रूवी वेब ढांचा, ने जेएएक्स 2008 नवीनीकरण पुरस्कार में दूसरा पुरस्कार जीता।[10]
नवंबर 2008 में, स्प्रिंगसोर्स ने ग्रूवी एंड ग्रेल्स कंपनी (जी2वन) का अधिग्रहण कर लिया।[11] अगस्त 2009 में वीएमवेयर ने स्प्रिंगसोर्स का अधिग्रहण किया।[12]
अप्रैल 2012 में, आठ साल की निष्क्रियता के बाद, स्पेक लीड ने जेएसआर 241 की स्थिति को निष्क्रिय कर दिया।[8]
2007 में ग्रूवी 1.0 प्रकशित होने से एक साल पहले स्ट्रेचन ने इस परियोजना को चुपचाप छोड़ दिया था।।[citation needed] अक्टूबर 2016 में, स्ट्रेचन ने कहा कि मुझे अभी भी ग्रूवी (जेनकींस पाइपलाइन बहुत ग्रूवी हैं!), जावा, गो, टाइपप्रति और कोटलिन से प्यार है।[13]
2 जुलाई 2012 को, ग्रूवी 2.0 प्रकशित किया गया था, जिसमें अन्य नई सुविधाओं के साथ, स्थिर संकलन और स्थिर प्रकार की जाँच सम्मिलित थी।
जब अप्रैल 2013 में ईएमसी संस्था (ईएमसी) और वीएमवेयर द्वारा निर्णायक सॉफ्टवेयर संयुक्त उद्यम को अलग कर दिया गया, तो ग्रूवी और ग्रेल्स ने इसके उत्पाद पोर्टफोलियो का हिस्सा बना लिया। निर्णायक ने अप्रैल 2015 से ग्रूवी और ग्रेल्स को प्रायोजित करना बंद कर दिया।[5] उसी महीने, ग्रूवी ने अपने ऊष्मायित्र के माध्यम से अपाचे सॉफ्टवेयर संस्था में कोडहॉस संग्रहालय से परियोजना प्रबंधन समिति (पीएमसी) में अपनी शासन संरचना को बदल दिया।[6] ग्रूवी ने अपाचे के ऊष्मायित्र से स्नातक किया और नवंबर 2015 में एक शीर्ष-स्तरीय परियोजना बन गई।[14]
विशेषताएं
अधिकांश मान्य जावा फ़ाइलें भी मान्य ग्रूवी फ़ाइलें हैं। हालाँकि दो भाषाएँ समान हैं, ग्रूवी कोड अधिक संक्षिप्त हो सकता है, क्योंकि इसमें उन सभी अवयवो की आवश्यकता नहीं होती है जिनकी जावा को आवश्यकता होती है।[15] यह जावा प्रोग्रामर्स के लिए ग्रूवी कार्यरचना मुहावरों को प्राप्त करने से पहले परिचित जावा रचनाक्रम के साथ धीरे-धीरे ग्रूवी सीखना संभव बनाता है।[16]
जावा में उपलब्ध ग्रूवी सुविधाओं में स्थिर और गतिशील टाइपिंग (कीवर्ड डीईएफ़ के साथ) दोनों शामिल हैं def), ऑपरेटर ओवरलोडिंग, सूचियों और साहचर्य सरणियों (मानचित्रों) के लिए मूल समर्थन, नियमित अभिव्यक्तियों के लिए मूल समर्थन, बहुरूपी पुनरावृत्ति, स्ट्रिंग इंटरपोलेशन, अतिरिक्त सहायक तरीके और सुरक्षित नेविगेशन ऑपरेटर ?. नल पॉइंटर्स के लिए स्वचालित रूप से जाँच करने के लिए (उदाहरण के लिए, variable?.method(), या variable?.field).[17]
चूंकि संस्करण 2 ग्रूवी मॉड्यूलरिटी का भी समर्थन करता है (प्रोजेक्ट की जरूरतों के अनुसार केवल आवश्यक जार को शिप करने में सक्षम होने के कारण, इस प्रकार ग्रूवी की लाइब्रेरी के आकार को कम करता है), टाइप चेकिंग, स्टैटिक कंपाइलिंग, प्रोजेक्ट कॉइन सिंटैक्स एन्हांसमेंट, जावा सिंटैक्स # कोड ब्लॉक और चल रहे प्रदर्शन संवर्द्धन का उपयोग कर invokedynamic निर्देश जावा संस्करण के इतिहास में पेश किया गया#Java SE 7.[18]
ग्रूवी विभिन्न मार्कअप भाषाओं जैसे XML और HTML के लिए मूल समर्थन प्रदान करता है, जो एक इनलाइन दस्तावेज़ वस्तु मॉडल (DOM) सिंटैक्स के माध्यम से पूरा किया जाता है। यह सुविधा एक समान और संक्षिप्त सिंटैक्स और प्रोग्रामिंग पद्धति के साथ कई प्रकार की विषम डेटा संपत्तियों की परिभाषा और हेरफेर को सक्षम बनाती है।[citation needed]
जावा के विपरीत, एक ग्रूवी स्रोत कोड फ़ाइल को एक (असंकलित) स्क्रिप्टिंग भाषा के रूप में निष्पादित किया जा सकता है, यदि इसमें किसी भी वर्ग परिभाषा के बाहर कोड शामिल है, यदि यह मुख्य विधि वाला वर्ग है, या यदि यह रननेबल या ग्रूवीटेस्टकेस है। एक ग्रूवी स्क्रिप्ट पूरी तरह से पार्स, संकलित और निष्पादित करने से पहले उत्पन्न होती है (पायथन और रूबी के समान)। यह हुड के नीचे होता है, और संकलित संस्करण को प्रक्रिया के आर्टिफैक्ट के रूप में सहेजा नहीं जाता है।[19]
ग्रूवीबीन्स, गुण
ग्रूवीबीन्स जावाबीन्स का ग्रूवी का संस्करण है। ग्रूवी निहित रूप से ग्राही और सुरेखक उत्पन्न करता है। निम्नलिखित कोड में, सेटकोलर (स्ट्रिंग कलर) तथा गेटकलर() निहित रूप से उत्पन्न होते हैं। अंतिम दो पंक्तियाँ, जो सीधे रंग तक पहुँचती दिखाई देती हैं, वास्तव में निहित रूप से उत्पन्न विधियों को बुला रही हैं।[20]
क्लास एग्रूवीबीन {
तार का रंग
}
डिफ माई ग्रूवीBean = नया Aग्रूवीBean ()
myग्रूवीBean.setColor ('बेबी ब्लू') जोर myग्रूवीBean.getColor() == 'बेबी ब्लू'
myग्रूवीBean.color = 'पेवर' जोर myग्रूवीBean.color == 'पेवर' </वाक्यविन्यास हाइलाइट>
ग्रूवी सूची और मानचित्रों को संभालने के लिए सरल, सुसंगत सिंटैक्स प्रदान करता है, जो जावा के सरणी सिंटैक्स की याद दिलाता है।[21] <वाक्यविन्यास लैंग = ग्रूवी> def MovieList = ['देर्सु उजाला', 'रैन', 'सात समुराई'] // एक सरणी की तरह दिखता है, लेकिन एक सूची है Assert MovieList[2] == 'सात समुराई' मूवीलिस्ट [3] = 'कैसाब्लांका' // सूची में एक तत्व जोड़ता है Assert MovieList.size() == 4
डीईएफ़ मंथ मैप = [ 'जनवरी' : 31, 'फ़रवरी' : 28, 'मार्च' : 31] // मैप डिक्लेयर करता है महीने का नक्शा ['मार्च'] == 31 // एक प्रविष्टि तक पहुँचता है महीनामैप ['अप्रैल'] = 30 // मानचित्र में एक प्रविष्टि जोड़ता है महीने का नक्शा। आकार () == 4 पर जोर दें </वाक्यविन्यास हाइलाइट>
प्रोटोटाइप एक्सटेंशन
ग्रूवी प्रोटोटाइप-आधारित प्रोग्रामिंग के लिए समर्थन प्रदान करता है ExpandoMetaClass, एक्सटेंशन मॉड्यूल (केवल ग्रूवी 2 में), ऑब्जेक्टिव-सी-जैसे ऑब्जेक्टिव-सी#श्रेणियां और DelegatingMetaClass.[22]
ExpandoMetaClass रूबी (प्रोग्रामिंग लैंग्वेज) के समान आसानी से कक्षा में परिवर्तन को व्यक्त करने के लिए एक डोमेन-विशिष्ट भाषा (डीएसएल) प्रदान करता है। रूबी की ओपन क्लास अवधारणा:
<वाक्यविन्यास लैंग = ग्रूवी> संख्या.मेटाक्लास {
sqrt = {गणित.sqrt (प्रतिनिधि)}
}
जोर दें 9.sqrt() == 3 जोर दें 4.sqrt() == 2 </वाक्यविन्यास हाइलाइट>
प्रोटोटाइप के माध्यम से कोड में ग्रूवी के परिवर्तन जावा में दिखाई नहीं दे रहे हैं, क्योंकि ग्रूवी में प्रत्येक विशेषता/विधि आमंत्रण मेटाक्लास रजिस्ट्री के माध्यम से जाता है। परिवर्तित कोड को केवल जावा से मेटाक्लास रजिस्ट्री में जाकर एक्सेस किया जा सकता है।
ग्रूवी भी ओवरराइडिंग विधियों की अनुमति देता है getProperty(), propertyMissing() दूसरों के बीच में, डेवलपर को किसी ऑब्जेक्ट पर कॉल को इंटरसेप्ट करने और उनके लिए एक क्रिया निर्दिष्ट करने में सक्षम बनाता है, एक सरल पहलू-उन्मुख प्रोग्रामिंग|पहलू-उन्मुख तरीके से। निम्न कोड वर्ग को सक्षम बनाता है java.lang.String जवाब देने के लिए hex संपत्ति:
<वाक्यविन्यास लैंग = ग्रूवी> एनम रंग {
काला ('#000000'), सफेद ('#FFFFFF'), लाल ('#FF0000'), नीला ('#0000FF')
स्ट्रिंग हेक्स
रंग (स्ट्रिंग हेक्स) {
यह.हेक्स = हेक्स
}
}
String.metaClass.getProperty = {स्ट्रिंग संपत्ति ->
def stringColor = प्रतिनिधि
अगर (संपत्ति == 'हेक्स') {
Color.values().ढूंढें {it.name().equalsIgnoreCase stringColor}?.hex
}
}
जोर सफेद। हेक्स == #FFFFFF जोर नीला .hex == #0000FF जोर काला .hex == #000000 हरे रंग का जोर दें। हेक्स == अशक्त </वाक्यविन्यास हाइलाइट>
ग्रेल्स फ्रेमवर्क व्यापक रूप से ग्रेल्स (ढांचे) को सक्षम करने के लिए मेटाप्रोग्रामिंग का उपयोग करता है # दृढ़ता गतिशील खोजकर्ता, जैसे User.findByName('Josh') और दूसरे।[23]
डॉट और कोष्ठक
ग्रूवी का सिंटैक्स कुछ स्थितियों में कोष्ठकों और बिंदुओं को छोड़ने की अनुमति देता है। निम्नलिखित ग्रूवी कोड
<वाक्यविन्यास लैंग = ग्रूवी> (कॉफी) .साथ (चीनी, दूध) .और (शराब) लें </वाक्यविन्यास हाइलाइट>
रूप में लिखा जा सकता है
<वाक्यविन्यास लैंग = ग्रूवी> चीनी, दूध और शराब के साथ कॉफी लें </वाक्यविन्यास हाइलाइट>
डोमेन-विशिष्ट भाषाओं (डीएसएल) के विकास को सक्षम करना जो सादे अंग्रेजी की तरह दिखती हैं।
कार्यात्मक प्रोग्रामिंग
हालाँकि ग्रूवी ज्यादातर एक वस्तु-उन्मुख भाषा है, यह कार्यात्मक प्रोग्रामिंग सुविधाएँ भी प्रदान करती है।
क्लोजर
ग्रूवी के दस्तावेज़ीकरण के मुताबिक: ग्रूवी में क्लोजर एक 'विधि सूचक' के समान काम करता है, जिससे कोड को बाद के समय में लिखा जा सकता है और चलाया जा सकता है।[24] ग्रूवी के क्लोजर फ्री वेरिएबल्स का समर्थन करते हैं, यानी वैरिएबल जिन्हें स्पष्ट रूप से पैरामीटर के रूप में पारित नहीं किया गया है, लेकिन इसके घोषणा संदर्भ में मौजूद है, आंशिक अनुप्रयोग (यह 'करी' शब्द है)[25]), प्रतिनिधिमंडल, अंतर्निहित, टाइप किए गए और अनटाइप किए गए पैरामीटर।
एक निर्धारित प्रकार के संग्रह पर काम करते समय, संग्रह पर एक ऑपरेशन को बंद करने का अनुमान लगाया जा सकता है:
<वाक्यविन्यास लैंग = ग्रूवी> सूची = [1, 2, 3, 4, 5, 6, 7, 8, 9]
/*
* गैर-शून्य संख्याओं को सत्य के लिए मजबूर किया जाता है, इसलिए जब यह% 2 == 0 (सम) होता है, तो यह असत्य होता है।
* निहित आईटी पैरामीटर के प्रकार को आईडीई द्वारा पूर्णांक के रूप में अनुमान लगाया जा सकता है।
* इसे इस प्रकार भी लिखा जा सकता है:
* list.findAll {पूर्णांक i -> i% 2}
* list.findAll {i -> i% 2}
*/
def बाधाओं = list.findAll {यह% 2}
बाधाओं पर जोर दें == [1, 3, 5, 7, 9] </वाक्यविन्यास हाइलाइट>
अभिव्यक्तियों के एक समूह को कार्यान्वयन के संदर्भ के बिना क्लोजर ब्लॉक में लिखा जा सकता है और प्रतिसाद देने वाली वस्तु को प्रतिनिधिमंडल का उपयोग करके बाद के बिंदु पर असाइन किया जा सकता है:
<वाक्यविन्यास लैंग = ग्रूवी> // कोड के इस ब्लॉक में कार्यान्वयन के संदर्भ के बिना भाव शामिल हैं डीईएफ़ ऑपरेशन = {
घोषित 5 योग 4 विभाजित करना 3 प्रिंट
} </वाक्यविन्यास हाइलाइट> <वाक्यविन्यास लैंग = ग्रूवी> /*
* यह क्लास उन ऑपरेशंस को हैंडल करेगी जिनका इस्तेमाल ऊपर क्लोजर में किया जा सकता है। एक और वर्ग * को एक ही तरीके से घोषित किया जा सकता है, लेकिन उदाहरण के लिए, webservice संचालन का उपयोग करना * हिसाब में। */
वर्ग अभिव्यक्ति {
बिगडेसिमल मान
/*
* हालांकि एक पूर्णांक को एक पैरामीटर के रूप में पारित किया जाता है, यह एक बिगडिसीमल में ज़ब्त किया जाता है, जैसा कि था
* परिभाषित। यदि कक्षा में 'घोषित (पूर्णांक मान)' विधि होती है, तो इसका उपयोग इसके बजाय किया जाएगा।
*/
डिफ डिक्लेयर (बिगडिसीमल वैल्यू) {
यह मूल्य = मूल्य
}
डीईएफ़ योग (बिगडिसीमल वैल्यू टू ऐड) {
this.value += valueToAdd
}
डिफ डिवाइड (बिगडिसीमल डिवाइडर) {
this.value /= भाजक
}
def संपत्ति गुम (स्ट्रिंग संपत्ति) {
अगर (संपत्ति == प्रिंट) प्रिंटलाइन मूल्य
}
} </वाक्यविन्यास हाइलाइट> <वाक्यविन्यास लैंग = ग्रूवी> // यहां परिभाषित किया गया है कि उपरोक्त कोड के ब्लॉक में भावों का जवाब कौन देगा। संचालन.प्रतिनिधि = नई अभिव्यक्ति () संचालन () </वाक्यविन्यास हाइलाइट>
करी
आमतौर पर आंशिक आवेदन कहा जाता है,[25] यह ग्रूवी फीचर क्लोजर के मापदंडों को उनके किसी भी तर्क में व्यतिक्रम मापदंडों पर सेट करने की अनुमति देता है, जिससे बाउंड वैल्यू के साथ एक नया क्लोजर बनता है। को एक तर्क देना curry() विधि तर्क एक को ठीक करेगी। एन तर्क देने से तर्क 1 ठीक हो जाएगा ... एन।
<वाक्यविन्यास लैंग = ग्रूवी> def joinTwoWordsWithSymbol = {प्रतीक, पहला, दूसरा -> पहला + प्रतीक + दूसरा} जोर दो शब्दों के साथ प्रतीक में शामिल हों ('#', 'हैलो', 'वर्ल्ड') == 'हैलो # वर्ल्ड'
def concatWords = joinTwoWordsWithSymbol.curry(' ') मुखर concatWords ('हैलो', 'वर्ल्ड') == 'हैलो वर्ल्ड'
def prependHello = concatWords.curry('Hello') // def prependHello = joinTwoWordsWithSymbol.curry(, 'Hello') जोर देना प्रीपेन्ड हैलो ('वर्ल्ड') == 'हैलो वर्ल्ड' </वाक्यविन्यास हाइलाइट>
करी का उपयोग विपरीत दिशा में भी किया जा सकता है (अंतिम N तर्कों को ठीक करते हुए)। rcurry().
<वाक्यविन्यास लैंग = ग्रूवी> def power = { BigDecimal value, BigDecimal power ->
मूल्य ** शक्ति
}
डीईएफ़ वर्ग = power.rcurry(2) डीईएफ़ क्यूब = power.rcurry(3)