बहुत सी भाषाएं हैं जो किसी प्रकार के मेटाप्रोग्रामिंग की अनुमति देती हैं । विशेष रूप से, मैं भाषाओं के लिस्प परिवार के बारे में बात करते हुए कोई जवाब नहीं देखकर हैरान हूं ।
विकिपीडिया से:
Metaprogramming कंप्यूटर प्रोग्राम को प्रोग्राम को उनके डेटा के रूप में व्यवहार करने की क्षमता के साथ लिखती है।
पाठ में बाद में:
लिस्प संभवतः ऐतिहासिक रूप से अपनी पूर्ववर्तीता की वजह से और इसके मेट्रोपोग्रामिंग की सादगी और शक्ति दोनों के कारण, सर्वोत्कृष्ट भाषा है।
लिस्प भाषाएं
लिस्प के लिए एक त्वरित बनाया इंट्रो निम्नानुसार है।
कोड को देखने का एक तरीका निर्देशों के एक सूट के रूप में है: ऐसा करें, फिर ऐसा करें, फिर यह दूसरी बात करें ... यह एक सूची है! कार्यक्रम करने के लिए चीजों की एक सूची। और निश्चित रूप से आप छोरों का प्रतिनिधित्व करने के लिए सूचियों के अंदर सूचियां हो सकती हैं और इसी तरह ।।
अगर हम इस तरह एक, ख, ग, घ तत्वों से युक्त एक सूची प्रतिनिधित्व करते हैं: (एबीसीडी) हम कुछ पाने कि एक लिस्प समारोह कॉल है, जहां की तरह दिखता a
समारोह है, और b
, c
, d
तर्क हैं। यदि वास्तव में विशिष्ट "हैलो वर्ल्ड!" कार्यक्रम को इस तरह लिखा जा सकता है:(println "Hello World!")
बेशक b
, c
या d
कुछ के रूप में अच्छी तरह से मूल्यांकन करने वाली सूची हो सकती है। निम्नलिखित: (println "I can add :" (+ 1 3) )
फिर "मैं जोड़ सकता हूं: 4" प्रिंट करूंगा।
तो, एक प्रोग्राम नेस्टेड सूचियों का एक सीरी है, और पहला तत्व एक फ़ंक्शन है। अच्छी खबर यह है कि हम सूचियों में हेरफेर कर सकते हैं! तो हम प्रोग्रामिंग भाषाओं में हेरफेर कर सकते हैं।
लिस्प लाभ
लिस्प्स इतनी प्रोग्रामिंग लैंग्वेज नहीं हैं, जितनी प्रोग्रामिंग लैंग्वेज बनाने के टूलकिट हैं। एक प्रोग्राम करने योग्य प्रोग्रामिंग भाषा।
नए ऑपरेटरों को बनाने के लिए लिसप्स में यह न केवल बहुत आसान है, कुछ ऑपरेटरों को अन्य भाषाओं में लिखना भी लगभग असंभव है क्योंकि फ़ंक्शन के पास जाने पर तर्कों का मूल्यांकन किया जाता है।
उदाहरण के लिए C- जैसी भाषा में मान लें कि आप अपने आप को एक if
ऑपरेटर लिखना चाहते हैं , जैसे कि:
my-if(condition, if-true, if-false)
my-if(false, print("I should not be printed"), print("I should be printed"))
इस मामले में दोनों तर्कों का मूल्यांकन और मुद्रित किया जाएगा, जो तर्कों के मूल्यांकन के आदेश के आश्रित हैं।
लिस्प्स में, एक ऑपरेटर लिखना (हम इसे मैक्रो कहते हैं) और एक फ़ंक्शन लिखना उसी चीज़ के बारे में है और उसी तरह से उपयोग किया जाता है। मैक्रो के लिए तर्क के रूप में पारित होने से पहले किसी मैक्रो के मापदंडों का मूल्यांकन नहीं किया जा रहा है। यह if
उपरोक्त जैसे कुछ ऑपरेटरों को लिखने में सक्षम होने के लिए आवश्यक है ।
वास्तविक दुनिया की भाषाएँ
यह दिखाते हुए कि वास्तव में यह कितना छोटा है, लेकिन मैं आपको और अधिक सीखने के लिए एक लिस्प में प्रोग्रामिंग की कोशिश करने के लिए प्रोत्साहित करता हूं। उदाहरण के लिए आप पर एक नज़र डाल सकते हैं:
- स्कीम , एक पुरानी, काफी "शुद्ध" लिस्प एक छोटे से कोर के साथ
- सामान्य लिस्प, एक अच्छी तरह से एकीकृत वस्तु प्रणाली के साथ एक बड़ा लिस्प, और कई कार्यान्वयन (यह एएनएसआई-मानकीकृत है)
- रैकेट एक टाइप लिस्प
- क्लोजर मेरे पसंदीदा, ऊपर के उदाहरण क्लोजर कोड थे। जेवीएम पर चलने वाला एक आधुनिक लिस्प। एसओ के साथ ही क्लोजर मैक्रोज़ के कुछ उदाहरण हैं (लेकिन यह शुरू करने के लिए सही जगह नहीं है। मैं पहले 4clojure , braveclojure या clojure koans पहले देखूंगा )।
ओह और वैसे, लिस्प का अर्थ है एलआईएसटी प्रोसेसिंग।
अपने उदाहरणों के बारे में
मैं नीचे दिए गए क्लोजर का उपयोग करके उदाहरण देने जा रहा हूं:
यदि आप add
क्लोजर में एक फ़ंक्शन लिख सकते हैं (defn add [a b] ...your-implementation-here... )
, तो आप इसे +
ऐसा नाम दे सकते हैं (defn + [a b] ...your-implementation-here... )
। यह वास्तव में वास्तविक कार्यान्वयन में किया जाता है (फ़ंक्शन का शरीर थोड़ा अधिक शामिल है लेकिन परिभाषा मूल रूप से समान है जैसा कि मैंने ऊपर लिखा है)।
Infix संकेतन के बारे में क्या? अच्छी तरह से क्लोजर एक prefix
(या पोलिश) संकेतन का उपयोग करता है, इसलिए हम एक infix-to-prefix
मैक्रो बना सकते हैं जो पूर्वनिर्मित कोड को क्लोजर कोड में बदल देगा। जो वास्तव में आश्चर्यजनक रूप से आसान है (यह वास्तव में क्लोजर कोनों में मैक्रो अभ्यास में से एक है)! यह जंगली में भी देखा जा सकता है, उदाहरण के लिए इंकेटर $=
मैक्रो देखें ।
यहाँ समझाए गए कोनों में से सबसे सरल संस्करण है:
(defmacro infix [form]
(list (second form) (first form) (nth form 2)))
;; takes a form (ie. some code) as parameter
;; and returns a list (ie. some other code)
;; where the first element is the second element from the original form
;; and the second element is the first element from the original form
;; and the third element is the third element from the original form (indexes start at 0)
;; example :
;; (infix (9 + 1))
;; will become (+ 9 1) which is valid Clojure code and will be executed to give 10 as a result
बिंदु को और भी आगे बढ़ाने के लिए, कुछ लिस्प उद्धरण :
“लिस्प को विशिष्ट बनाने का एक हिस्सा यह है कि इसे विकसित करने के लिए डिज़ाइन किया गया है। आप नए लिस्प ऑपरेटरों को परिभाषित करने के लिए लिस्प का उपयोग कर सकते हैं। जैसा कि नए सार लोकप्रिय हो जाते हैं (उदाहरण के लिए ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग), लिस्प में उन्हें लागू करना हमेशा आसान होता है। डीएनए की तरह, ऐसी भाषा शैली से बाहर नहीं जाती है। ”
- पॉल ग्राहम, एएनएसआई कॉमन लिस्प
“लिस्प में प्रोग्रामिंग ब्रह्मांड की आदिम शक्तियों के साथ खेलने जैसा है। यह आपकी उंगलियों के बीच बिजली की तरह महसूस होता है। कोई अन्य भाषा भी करीब महसूस नहीं करती है। ”
- ग्लेन एर्लिच, लिस्प की सड़क