मैं कुंद हो जाऊंगा: मुझे समझ नहीं आ रहा है कि "सिंटैक्स के लिए क्या उपयोग किया जाए, न कि शब्दार्थ के लिए"। यही कारण है कि इस उत्तर का हिस्सा चंद्र के उत्तर से निपटेगा , और दूसरा भाग मूल प्रश्न का उत्तर देने का मेरा प्रयास होगा।
जब शब्द "शब्दार्थ" का उपयोग प्रोग्रामिंग में किया जाता है, तो यह उस तरीके को संदर्भित करता है जिस तरह से भाषा के लेखक ने अपनी भाषा की व्याख्या करने के लिए चुना था। यह आम तौर पर सूत्रों के एक समूह के लिए उबलता है जो भाषा के व्याकरण नियमों को कुछ अन्य नियमों में बदल देता है जिसे पाठक को परिचित माना जाता है। उदाहरण के लिए, प्लॉटकिन ने अपनी पुस्तक स्ट्रक्चरल एप्रोच टू ऑपरेशनल सेमैटिक्स में इस बात की व्याख्या करने के लिए तार्किक व्युत्पत्ति भाषा का उपयोग किया है कि अमूर्त सिंटैक्स क्या मूल्यांकन करता है (प्रोग्राम चलाने के लिए इसका क्या मतलब है)। दूसरे शब्दों में, अगर सिंटैक्स कुछ स्तर पर प्रोग्रामिंग भाषा का गठन करता है, तो इसके लिए कुछ शब्दार्थ होना चाहिए, अन्यथा यह अच्छी तरह से है ... प्रोग्रामिंग भाषा नहीं है।
लेकिन, चलो इस समय के लिए औपचारिक परिभाषाएं भूल जाएं, आखिरकार, इरादे को समझना महत्वपूर्ण है। इसलिए, ऐसा लगता है कि चंद्रयान अपने पाठकों को मैक्रोज़ का उपयोग करने के लिए प्रोत्साहित करेगा जब कार्यक्रम में कोई नया अर्थ नहीं जोड़ा जाएगा, लेकिन बस कुछ प्रकार का संक्षिप्त नाम। मेरे लिए यह अजीब लगता है और वास्तव में मैक्रोज़ कैसे उपयोग किया जाता है, इसके विपरीत। नीचे दिए गए उदाहरण हैं जो स्पष्ट रूप से नए अर्थ बनाते हैं:
defun
और दोस्तों, जो भाषा का एक अनिवार्य हिस्सा हैं उन्हीं शब्दों में वर्णित नहीं किया जा सकता है, जिन्हें आप फ़ंक्शन कॉल का वर्णन करेंगे।
setf
अभिव्यक्ति के प्रभावों का वर्णन करने के लिए कार्य कैसे कार्य करते हैं, यह वर्णन अपर्याप्त है (setf (aref x y) z)
।
with-output-to-string
मैक्रो के अंदर कोड के शब्दार्थ को भी बदलता है। इसी तरह, with-current-buffer
और अन्य with-
मैक्रोज़ का एक गुच्छा ।
dotimes
और इसी तरह के कार्यों के संदर्भ में वर्णित नहीं किया जा सकता है।
ignore-errors
कोड के शब्दार्थ को बदल देता है।
cl-lib
पैकेज, eieio
पैकेज और कुछ अन्य लगभग सर्वव्यापी लाइब्रेरी में परिभाषित मैक्रोज़ का एक पूरा गुच्छा है जो Emacs Lisp में उपयोग किया जाता है, जबकि ऐसा लग सकता है कि फ़ंक्शन रूपों की अलग-अलग व्याख्याएं हैं।
तो, अगर कुछ भी हो, मैक्रोज़ एक भाषा में नए शब्दार्थ को पेश करने का उपकरण है। मैं ऐसा करने का एक वैकल्पिक तरीका नहीं सोच सकता (कम से कम Emacs Lisp में नहीं)।
जब मैं मैक्रोज़ का उपयोग नहीं करूंगा:
जब वे किसी भी नए निर्माण का परिचय नहीं देते हैं, तो नए शब्दार्थ के साथ (जैसे कि फ़ंक्शन अच्छा काम करेगा)।
जब यह सिर्फ एक प्रकार की सुविधा है (अर्थात एक मैक्रो बनाने का नाम है mvb
जो cl-multiple-value-bind
केवल इसे छोटा बनाने के लिए फैलता है )।
जब मैं मैक्रो द्वारा छिपे हुए त्रुटि हैंडलिंग कोड की बहुत उम्मीद करता हूं (जैसा कि नोट किया गया है, मैक्रोज़ डिबग करना मुश्किल है)।
जब मैं दृढ़ता से कार्यों पर मैक्रोज़ पसंद करूंगा:
जब डोमेन-विशिष्ट अवधारणाओं को फ़ंक्शन कॉल द्वारा अस्पष्ट किया जाता है। उदाहरण के लिए, यदि किसी को उसी context
तर्क को कार्यों के एक समूह में पारित करने की आवश्यकता होती है जिसे उत्तराधिकार में बुलाया जाना चाहिए, तो मैं उन्हें एक मैक्रो में लपेटना पसंद करूंगा, जहां context
तर्क छिपा हुआ है।
जब फ़ंक्शन रूप में सामान्य कोड अत्यधिक क्रिया है (Emacs में नंगे पुनरावृत्ति निर्माण लिस्प मेरे स्वाद के लिए बहुत क्रियात्मक हैं और अनावश्यक रूप से प्रोग्रामर को निम्न-स्तरीय कार्यान्वयन विवरण में उजागर करते हैं)।
चित्रण
नीचे दिया गया संस्करण नीचे दिया गया है, जिसका अर्थ है कि कंप्यूटर विज्ञान में शब्दार्थ से एक अंतर्ज्ञान देना।
मान लीजिए कि आपके पास इन सिंटैक्स नियमों के साथ एक अत्यंत सरल प्रोग्रामिंग भाषा है:
variable := 1 | 0
operation := +
expression := variable | (expression operation expression)
इस भाषा के साथ हम जैसे "कार्यक्रमों" का निर्माण कर सकते (1+0)+1
या 0
या ((0+0))
आदि
लेकिन जब तक हम शब्दार्थ नियम प्रदान नहीं करते, ये "कार्यक्रम" निरर्थक हैं।
मान लीजिए कि अब हम अपनी भाषा को (शब्दार्थ) नियमों से लैस करते हैं:
0+0 0+1 1+0 1+1 (exp)
---, ---, ---, ---, -----
0 1+0 1 0 exp
अब हम वास्तव में इस भाषा का उपयोग करके गणना कर सकते हैं। यही है, हम वाक्यात्मक प्रतिनिधित्व ले सकते हैं, इसे सार रूप में समझ सकते हैं (दूसरे शब्दों में, इसे सार वाक्यविन्यास में परिवर्तित करें), फिर इस प्रतिनिधित्व में हेरफेर करने के लिए अर्थ नियमों का उपयोग करें।
जब हम भाषाओं के लिस्प परिवार के बारे में बात करते हैं, तो फ़ंक्शन मूल्यांकन के बुनियादी शब्दार्थ नियम मोटे तौर पर लंबो-कैलकुलस के होते हैं:
(f x) (lambda x y) x
-----, ------------, ---
fx ^x.y x
उद्धरण और मैक्रो-विस्तार तंत्र को मेटा-प्रोग्रामिंग टूल के रूप में भी जाना जाता है, अर्थात वे केवल प्रोग्रामिंग के बजाय कार्यक्रम के बारे में बात करने की अनुमति देते हैं । वे "मेटा लेयर" का उपयोग करके नए शब्दार्थ का निर्माण करके इसे प्राप्त करते हैं। इस तरह के एक सरल मैक्रो का उदाहरण है:
(a . b)
-------
(cons a b)
यह वास्तव में Emacs लिस्प में एक मैक्रो नहीं है, लेकिन यह हो सकता था। मैंने केवल सादगी के लिए चुना। ध्यान दें कि ऊपर परिभाषित कोई भी नियम इस मामले पर लागू नहीं होगा क्योंकि निकटतम उम्मीदवार एक फ़ंक्शन के रूप में (f x)
व्याख्या f
करता है, जबकि a
आवश्यक रूप से एक फ़ंक्शन नहीं है।