2013-07-08 11 views
11

मैं क्लोजर सीखने के लिए नया हूं। मैंने कुछ महीने पहले शुरू किया था। मै मैक्रोज़ सीखने की कोशिश कर रहा हूं।क्लोजर मैक्रोज़ सी मैक्रोज़ से अलग कैसे हैं?

मुझे प्रारंभ में क्लोजर में मैक्रोज़ और उच्च-आदेश कार्यों के बीच समझ में अंतर आया है क्योंकि उच्च आदेश फ़ंक्शन लैम्ब्डा ले सकता है और उनमें से किसी एक को निष्पादित कर सकता है कि वह किसी भी परिस्थिति और फ़िल्टर के आधार पर कितनी बार चाहता था।

इसलिए मैंने question को स्टैक ओवरव्लो पर इसके बारे में एक साधारण उदाहरण के साथ पोस्ट किया। मुझे अपने संदेह जवाब से मंजूरी मिली। विपरीत कार्यों शरीर का मूल्यांकन करने के

यह मैं क्या समझ में आ रहा है,

  • मैक्रो सभी तर्कों का मूल्यांकन नहीं होंगे।
  • मैक्रोज़ का मूल्यांकन करने के बारे में चुनिंदा हो सकता है और उद्धरण, अनकोट और स्प्लिसिंग सिंटैक्स का उपयोग करके कोड के एक टुकड़े को दूसरे में कैसे परिवर्तित किया जाए।
  • मैक्रो से बाहर आने वाला अंतिम कोड तब मूल्यांकन किया जाता है।

तो मेरा सवाल यह है कि यह प्रीप्रोसेसर निर्देशों और सी में उपयोग किए गए मैक्रोज़ से अलग कैसे है? लिस्प/क्लोजर मैक्रोज़ उन डेवलपर्स को क्या शक्ति देता है जो सी मैक्रोज़ पूरी तरह से कमी करते हैं और अक्सर व्यापक रूप से उपयोग किए जाते हैं।

उत्तर

12

कुछ उल्लेखनीय मतभेद:

  • Clojure मैक्रो लिस्प डेटा संरचनाओं जबकि सी मैक्रो पाठ पर काम पर कार्य करते हैं। यह क्षमता लिस्प्स homoiconic होने का परिणाम है (यानी लिस्प स्रोत कोड लिस्प डेटा संरचनाओं के रूप में व्यक्त किया जाता है)। एक मैक्रो सिस्टम प्रभावी होने के लिए Homoiconicity सख्ती से जरूरी नहीं है, लेकिन यह निश्चित रूप से इसे और अधिक सुविधाजनक और प्राकृतिक बनाता है।
  • आप (जैसे eval का प्रयोग करके) क्रम के साथ-साथ संकलन समय पर Clojure मैक्रो निष्पादित कर सकते हैं
  • Clojure मैक्रो Clojure ही में लिखा है। सी प्रीप्रोसेसर मैक्रोज़ के साथ तुलना करें, जिसमें अपनी अलग मिनी-भाषा है। अधिक जटिल मैक्रोज़ लिखते समय यह एक बड़ा फायदा है: आपको मानसिक रूप से अलग-अलग भाषाओं के बीच स्विच करने की ज़रूरत नहीं है (आपको निश्चित रूप से मैक्रो बनाम प्रोसेसिंग करते समय आप जिस कोड को निष्पादित करना चाहते हैं, उसके बीच मानसिक रूप से अंतर करने की आवश्यकता है। मैक्रो के उत्पादन)
  • Clojure मैक्रो ट्यूरिंग के रूप में उत्पन्न पूरा - आप उन्हें भीतर मनमाना कोड पीढ़ी प्रदर्शन कर सकते हैं। मानक सी प्रीप्रोसेसर मैक्रोज़ के लिए सच नहीं है, जो जटिल कोड पीढ़ी को व्यक्त करने की उनकी क्षमता में कुछ हद तक सीमित हैं।संपादित: धन्यवाद जेरेमी कुछ मनोरंजक हैक्स जिसके द्वारा सी पूर्वप्रक्रमक एक महत्वपूर्ण मोड़: पूर्ण तरीके से अभिनय मजबूर किया जा सकता है के लिए लिंक प्रदान करने के लिए। समग्र बिंदु अभी भी खड़ा है: ये सामान्य उद्देश्य कोड लिखने के लिए वास्तव में व्यावहारिक तरीके नहीं हैं।

तर्कसंगत रूप से, मैक्रोज़ अभी भी लिस्पस की विशिष्ट "हत्यारा सुविधा" हैं। इस विषय पर थोड़ा अतिरिक्त स्पष्टीकरण के लिए, पॉल ग्राहम के निबंध को पढ़ने के लायक है "What Made Lisp Different"

+3

असल में, आप homoiconicity बिना एक पूर्ण मैक्रो प्रणाली हो सकता है। कोड का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली डेटा संरचनाओं में लिस्प डेटा संरचनाओं की तुलना में अधिक जटिल आकार होता है। उदाहरण के लिए देखें [स्कैला मैक्रोज़] (http://docs.scala-lang.org/overviews/macros/overview.html)। –

+1

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

+0

@ जेरेमी डब्ल्यू। शेरमेन आप सी मैक्रोज़ ट्यूरिंग को पूरा कर सकते हैं, लेकिन उनके साथ मनमाने ढंग से परिवर्तन करना संभव नहीं है (भले ही आप जितना चाहें उतने पास करते हैं), जो मुझे लगता है कि यह अधिक महत्वपूर्ण बात है। उदाहरण के लिए आप एक मैक्रो 'एम' नहीं लिख सकते हैं, जैसे कि' एम (एफ (एक्स)) '' f (x, y) 'या' g (x) 'तक फैलता है। – sepp2k

4

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

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

4

सी मैक्रोज़ पूरी तरह से पाठपरक पुनर्लेखन मैक्रोज़ हैं। कुछ भी बहुत उनके बारे में सी कि किया जा रहा है वे कहाँ से आए से अलग है - आप किसी भी पाठ पर सी पूर्वप्रक्रमक cpp(1) उपयोग कर सकते हैं। नतीजतन, सी प्रीप्रोसेसर का उपयोग करके गैर-सी रूपों को उत्पन्न करना आसान है, और आपको अक्सर सीओ के रूप में काफी छोटी चीजें करने के लिए हुप्स के माध्यम से कूदना होता है। इस वजह से सी मैक्रोज़ pitfalls से भरे हुए हैं।

Clojure macros Clojure कोड है कि नियमित रूप Clojure कार्यों से नियमों का एक अलग सेट का उपयोग कर कार्यान्वित कर रहे हैं। इसके बजाय का मूल्यांकन तर्क प्राप्त करने और एक परिणाम के लौटने की, वे unevaluated रूपों प्राप्त करते हैं और एक रूप है, जो अंततः सामान्य निष्पादन के दौरान मूल्यांकन किया जा सकता है लौटने।

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