एस-एक्सप्रेशन: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{Short description|Data serialization format}} | {{Short description|Data serialization format}} | ||
[[File:Corrected_S-expression_tree_2.svg|thumb| | [[File:Corrected_S-expression_tree_2.svg|thumb|एस-अभिव्यक्ति <code>(* 2 (+ 3 4))</code> का प्रतिनिधित्व करने वाली ट्री ([[डेटा संरचना]]) डेटा संरचना ]][[कंप्यूटर प्रोग्रामिंग]] में, '''एस-अभिव्यक्ति''' (या '''प्रतीकात्मक अभिव्यक्ति''', जिसे '''सेक्सपीआर''' या '''सेक्सपी''' के रूप में संक्षिप्त किया गया है) नीडित [[ सूची (कंप्यूटिंग) |सूची (कंप्यूटिंग)]] (ट्री डेटा संरचना) डेटा के लिए समान नाम वाले अंकन में अभिव्यक्ति है। प्रोग्रामिंग भाषा [[लिस्प (प्रोग्रामिंग भाषा)]] के लिए एस-अभिव्यक्ति का आविष्कार किया गया था और इसे लोकप्रिय बनाया गया था, जो उन्हें स्रोत कोड के साथ-साथ डेटा के लिए भी उपयोग करता है। | ||
लिस्प के सामान्य संश्लेषित [[ सिंटेक्स (प्रोग्रामिंग भाषाएं) |सिंटेक्स (प्रोग्रामिंग भाषाएं)]] में, एस-अभिव्यक्ति को शास्त्रीय रूप से परिभाषित किया गया है<ref name="McCarthy1960">John McCarthy (1960/2006). [http://www-formal.stanford.edu/jmc/recursive/recursive.html Recursive functions of symbolic expressions] {{webarchive|url=https://web.archive.org/web/20040202215021/http://www-formal.stanford.edu/jmc/recursive/recursive.html |date=2004-02-02 }}. Originally published in [[Communications of the ACM]].</ref> जैसा की दर्शया गया है | लिस्प के सामान्य संश्लेषित [[ सिंटेक्स (प्रोग्रामिंग भाषाएं) |सिंटेक्स (प्रोग्रामिंग भाषाएं)]] में, एस-अभिव्यक्ति को शास्त्रीय रूप से परिभाषित किया गया है<ref name="McCarthy1960">John McCarthy (1960/2006). [http://www-formal.stanford.edu/jmc/recursive/recursive.html Recursive functions of symbolic expressions] {{webarchive|url=https://web.archive.org/web/20040202215021/http://www-formal.stanford.edu/jmc/recursive/recursive.html |date=2004-02-02 }}. Originally published in [[Communications of the ACM]].</ref> जैसा की दर्शया गया है | ||
Line 7: | Line 7: | ||
# <code>(''x'' . ''y'')</code> रूप की [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] जहां x और y एस-अभिव्यक्ति हैं। | # <code>(''x'' . ''y'')</code> रूप की [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] जहां x और y एस-अभिव्यक्ति हैं। | ||
यह परिभाषा कोशिकाओं की श्रृंखला के रूप में सूची के लिस्प के प्रतिनिधित्व को दर्शाती है, प्रत्येक क्रमित युग्म है। साधारण सूचियों में, y आगमी कोष्ठिका (यदि कोई हो) की ओर संकेत करता है, इस प्रकार [[लिंक्ड सूची|संलग्न सूची]] बनाता है। परिभाषा के [[ प्रत्यावर्तन |पुनरावर्ती]] अनुच्छेद का अर्थ है कि यह प्रतिनिधित्व और एस-अभिव्यक्ति अंकन दोनों ही किसी भी [[बाइनरी ट्री]] का प्रतिनिधित्व कर सकते हैं। यद्यपि, प्रतिनिधित्व सैद्धांतिक रूप से परिपत्र संदर्भों की अनुमति दे सकता है, ऐसी स्थितियों में संरचना निश्चित ही ट्री नहीं है, परन्तु [[चक्रीय ग्राफ]] है, और शास्त्रीय एस-अभिव्यक्ति अंकन में इसका प्रतिनिधित्व नहीं किया जा सकता है जब तक कि प्रति संदर्भ के लिए अंकन प्रदान नहीं किया जाता है ([[एसक्यूएल]] [[विदेशी कुंजी]], [[एसजीएमएल]]/[[एक्सएमएल]] आईडीआरईएफ, आदि के अनुरूप)। [[ सामान्य लिस्प |सामान्य लिस्प]] <ref>{{cite web|title=Common Lisp HyperSpec: 22.4 - The Printer Dictionary: *PRINT-CIRCLE*|url=http://clhs.lisp.se/Body/v_pr_cir.htm|date=2018-12-28}}</ref> और [[योजना (प्रोग्रामिंग भाषा)|स्कीम (प्रोग्रामिंग भाषा)]]<ref>{{cite web|title=Revised<sup>7</sup> Report on the Algorithmic Language Scheme: Section 2.4: Datum Labels|url=https://small.r7rs.org/attachment/r7rs.pdf#section.2.4|date=2013-07-06}}</ref> जैसी आधुनिक लिस्प उपभाषा डेटाम लेबल के माध्यम से ऐसा सिंटैक्स प्रदान करती हैं, जिसके साथ ऑब्जेक्टओं को चिह्नित किया जा सकता है, जिसे बाद में कहीं और दोहराया जा सकता है, जो फिर द्विगुणित संरचना के अतिरिक्त साझा को इंगित करना, जिससे [[ लिस्प पाठक |लिस्प पाठक]] या प्रारूप (सामान्य लिस्प) को पता लगाने में सक्षम बनाना और इस प्रकार असीमित पुनरावृत्ति के बिना चक्रों के मूल्यांकन या निष्पादन को ट्रिगर करना | इस प्रकार से यह परिभाषा कोशिकाओं की श्रृंखला के रूप में सूची के लिस्प के प्रतिनिधित्व को दर्शाती है, प्रत्येक क्रमित युग्म है। साधारण सूचियों में, y आगमी कोष्ठिका (यदि कोई हो) की ओर संकेत करता है, इस प्रकार [[लिंक्ड सूची|संलग्न सूची]] बनाता है। परिभाषा के [[ प्रत्यावर्तन |पुनरावर्ती]] अनुच्छेद का अर्थ है कि यह प्रतिनिधित्व और एस-अभिव्यक्ति अंकन दोनों ही किसी भी [[बाइनरी ट्री]] का प्रतिनिधित्व कर सकते हैं। यद्यपि, प्रतिनिधित्व सैद्धांतिक रूप से परिपत्र संदर्भों की अनुमति दे सकता है, ऐसी स्थितियों में संरचना निश्चित ही ट्री नहीं है, परन्तु [[चक्रीय ग्राफ]] है, और शास्त्रीय एस-अभिव्यक्ति अंकन में इसका प्रतिनिधित्व नहीं किया जा सकता है जब तक कि प्रति संदर्भ के लिए अंकन प्रदान नहीं किया जाता है ([[एसक्यूएल]] [[विदेशी कुंजी]], [[एसजीएमएल]]/[[एक्सएमएल]] आईडीआरईएफ, आदि के अनुरूप)। इस प्रकार से [[ सामान्य लिस्प |सामान्य लिस्प]] <ref>{{cite web|title=Common Lisp HyperSpec: 22.4 - The Printer Dictionary: *PRINT-CIRCLE*|url=http://clhs.lisp.se/Body/v_pr_cir.htm|date=2018-12-28}}</ref> और [[योजना (प्रोग्रामिंग भाषा)|स्कीम (प्रोग्रामिंग भाषा)]]<ref>{{cite web|title=Revised<sup>7</sup> Report on the Algorithmic Language Scheme: Section 2.4: Datum Labels|url=https://small.r7rs.org/attachment/r7rs.pdf#section.2.4|date=2013-07-06}}</ref> जैसी आधुनिक लिस्प उपभाषा डेटाम लेबल के माध्यम से ऐसा सिंटैक्स प्रदान करती हैं, जिसके साथ ऑब्जेक्टओं को चिह्नित किया जा सकता है, जिसे बाद में कहीं और दोहराया जा सकता है, जो फिर द्विगुणित संरचना के अतिरिक्त साझा को इंगित करना, जिससे [[ लिस्प पाठक |लिस्प पाठक]] या प्रारूप (सामान्य लिस्प) को पता लगाने में सक्षम बनाना और इस प्रकार असीमित पुनरावृत्ति के बिना चक्रों के मूल्यांकन या निष्पादन को ट्रिगर करना था | ||
: <code>#n=(''x'' ''y'' . #n#)</code> | : <code>#n=(''x'' ''y'' . #n#)</code> | ||
एक परमाणु की परिभाषा संदर्भ के अनुसार परिवर्तित होती रहती है; जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) द्वारा मूल परिभाषा में,<ref name="McCarthy1960"/> यह माना गया था कि अलग-अलग [[प्रतीक (प्रोग्रामिंग)|प्रतीकों (प्रोग्रामिंग)]] का अनंत समुच्चय स्थित था, जिसे [[लैटिन लिपि|लैटिन लिपियों]] और एकल एम्बेडेड रिक्त स्थान (कैरैक्टर [[स्ट्रिंग (कंप्यूटिंग)]] और संख्यात्मक [[ शाब्दिक (कंप्यूटर प्रोग्रामिंग) |शाब्दिक (कंप्यूटर प्रोग्रामिंग)]] का एक उपसमुच्चय) वाले अंकों की श्रृंखला के रूप में दर्शाया गया था। | इस प्रकार से एक परमाणु की परिभाषा संदर्भ के अनुसार परिवर्तित होती रहती है; जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) द्वारा मूल परिभाषा में,<ref name="McCarthy1960"/> यह माना गया था कि अलग-अलग [[प्रतीक (प्रोग्रामिंग)|प्रतीकों (प्रोग्रामिंग)]] का अनंत समुच्चय स्थित था, जिसे [[लैटिन लिपि|लैटिन लिपियों]] और एकल एम्बेडेड रिक्त स्थान (कैरैक्टर [[स्ट्रिंग (कंप्यूटिंग)]] और संख्यात्मक [[ शाब्दिक (कंप्यूटर प्रोग्रामिंग) |शाब्दिक (कंप्यूटर प्रोग्रामिंग)]] का एक उपसमुच्चय) वाले अंकों की श्रृंखला के रूप में दर्शाया गया था। | ||
अधिकांश आधुनिक सेक्सपीआर अंकन अधिक सामान्य उद्धृत स्ट्रिंग (उदाहरण के लिए विराम चिह्न या पूर्ण [[यूनिकोड]] सहित) की अनुमति देते हैं, और 2 से अधिक सदस्यों के साथ सूचियों का प्रतिनिधित्व करने के लिए संक्षिप्त अंकन का उपयोग करते हैं, ताकि | अतः अधिकांश आधुनिक सेक्सपीआर अंकन अधिक सामान्य उद्धृत स्ट्रिंग (उदाहरण के लिए विराम चिह्न या पूर्ण [[यूनिकोड]] सहित) की अनुमति देते हैं, और 2 से अधिक सदस्यों के साथ सूचियों का प्रतिनिधित्व करने के लिए संक्षिप्त अंकन का उपयोग करते हैं, ताकि | ||
: <code>(''x'' ''y'' ''z'')</code> | : <code>(''x'' ''y'' ''z'')</code> | ||
इसका अर्थ है कि | अतः इसका अर्थ है कि | ||
: <code>(''x'' . (''y'' . (''z'' . NIL)))</code> | : <code>(''x'' . (''y'' . (''z'' . NIL)))</code> | ||
Line 21: | Line 21: | ||
<code>NIL</code> विशेष अंत-सूची [[ वस्तु (कंप्यूटर विज्ञान) |ऑब्जेक्ट (कंप्यूटर विज्ञान)]] है (वैकल्पिक रूप लिखित <code>()</code>, जो स्कीम (प्रोग्रामिंग भाषा) में एकमात्र प्रतिनिधित्व है<ref>{{Cite web|url=https://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html|title=Revised^5 Report on the Algorithmic Language Scheme|website=schemers.org}}</ref>)। | <code>NIL</code> विशेष अंत-सूची [[ वस्तु (कंप्यूटर विज्ञान) |ऑब्जेक्ट (कंप्यूटर विज्ञान)]] है (वैकल्पिक रूप लिखित <code>()</code>, जो स्कीम (प्रोग्रामिंग भाषा) में एकमात्र प्रतिनिधित्व है<ref>{{Cite web|url=https://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html|title=Revised^5 Report on the Algorithmic Language Scheme|website=schemers.org}}</ref>)। | ||
प्रोग्रामिंग भाषाओं के लिस्प वर्ग में, स्रोत कोड और डेटा दोनों का प्रतिनिधित्व करने के लिए एस-अभिव्यक्ति का उपयोग किया जाता है। एस-अभिव्यक्ति के अन्य उपयोग [[दस्तावेज़ शैली शब्दार्थ और विशिष्टता भाषा|डॉक्यूमेंट शैली शब्दार्थ और विशिष्टता भाषा]] जैसी लिस्प-व्युत्पन्न भाषाओं में हैं, और [[इंटरनेट संदेश एक्सेस प्रोटोकॉल]] और जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के [[ सामान्य व्यापार संचार भाषा |सामान्य व्यापार संचार भाषा]] जैसे [[संचार प्रोटोकॉल]] में मार्क-अप के रूप में हैं। इसका उपयोग [[WebAssembly|वेब असेंबली]] के पाठ प्रतिनिधित्व के रूप में भी किया जाता है। सिंटैक्स और समर्थित [[डेटा प्रकार|डेटा प्रकारों]] का विवरण अलग-अलग भाषाओं में भिन्न होता है, परन्तु इन भाषाओं में सबसे सामान्य विशेषता एस-अभिव्यक्ति और प्रीफ़िक्स अंकन का उपयोग है। | इस प्रकार से प्रोग्रामिंग भाषाओं के लिस्प वर्ग में, स्रोत कोड और डेटा दोनों का प्रतिनिधित्व करने के लिए एस-अभिव्यक्ति का उपयोग किया जाता है। एस-अभिव्यक्ति के अन्य उपयोग [[दस्तावेज़ शैली शब्दार्थ और विशिष्टता भाषा|डॉक्यूमेंट शैली शब्दार्थ और विशिष्टता भाषा]] जैसी लिस्प-व्युत्पन्न भाषाओं में हैं, और [[इंटरनेट संदेश एक्सेस प्रोटोकॉल]] और जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के [[ सामान्य व्यापार संचार भाषा |सामान्य व्यापार संचार भाषा]] जैसे [[संचार प्रोटोकॉल]] में मार्क-अप के रूप में हैं। इसका उपयोग [[WebAssembly|वेब असेंबली]] के पाठ प्रतिनिधित्व के रूप में भी किया जाता है। अतः सिंटैक्स और समर्थित [[डेटा प्रकार|डेटा प्रकारों]] का विवरण अलग-अलग भाषाओं में भिन्न होता है, परन्तु इन भाषाओं में सबसे सामान्य विशेषता एस-अभिव्यक्ति और प्रीफ़िक्स अंकन का उपयोग है। | ||
== डेटाटाइप और सिंटैक्स == | == डेटाटाइप और सिंटैक्स == | ||
एस-अभिव्यक्ति प्रारूप के कई प्रकार हैं, जो विभिन्न डेटाटाइप के लिए विभिन्न सिंटैक्स का समर्थन करते हैं। इस प्रकार से सबसे व्यापक रूप से समर्थित हैं: | अतः एस-अभिव्यक्ति प्रारूप के कई प्रकार हैं, जो विभिन्न डेटाटाइप के लिए विभिन्न सिंटैक्स का समर्थन करते हैं। इस प्रकार से सबसे व्यापक रूप से समर्थित हैं: | ||
* सूचियाँ और जोड़े: <code>(1 () (2 . 3) (4))</code> | * सूचियाँ और जोड़े: <code>(1 () (2 . 3) (4))</code> | ||
* प्रतीक: <code>with-hyphen</code> <code>?@!$</code> <code>|a symbol with spaces|</code> | * प्रतीक: <code>with-hyphen</code> <code>?@!$</code> <code>|a symbol with spaces|</code> | ||
Line 30: | Line 30: | ||
* पूर्णांक: <code>-9876543210</code> | * पूर्णांक: <code>-9876543210</code> | ||
* दशमलव संख्याएं: <code>-0.0</code> <code>6.28318</code> <code>6.022e23</code> | * दशमलव संख्याएं: <code>-0.0</code> <code>6.28318</code> <code>6.022e23</code> | ||
कैरैक्टर <code>#</code> का उपयोग प्रायः सिंटैक्स में एक्सटेंशन उपसर्ग करने के लिए किया जाता है, उदाहरण के लिए हेक्साडेसिमल पूर्णांकों के लिए <code>#x10</code> हेक्साडेसिमल या कैरैक्टरों के लिए <code>#\C</code> है। | इस प्रकार से कैरैक्टर <code>#</code> का उपयोग प्रायः सिंटैक्स में एक्सटेंशन उपसर्ग करने के लिए किया जाता है, उदाहरण के लिए हेक्साडेसिमल पूर्णांकों के लिए <code>#x10</code> हेक्साडेसिमल या कैरैक्टरों के लिए <code>#\C</code> है। | ||
== लिस्प में प्रयोग == | == लिस्प में प्रयोग == | ||
लिस्प में स्रोत कोड का प्रतिनिधित्व करते समय, एस-अभिव्यक्ति का प्रथम अवयव सामान्यतः ऑपरेटर या फ़ंक्शन का नाम होता है और किसी भी शेष अवयवों को तर्कों के रूप में माना जाता है। इसे उपसर्ग अंकन या [[पोलिश संकेतन|पोलिश अंकन]] कहा जाता है। उदाहरण के रूप में, C (प्रोग्रामिंग लैंग्वेज) में {{nowrap begin}}<code>4 == (2 + 2)</code>{{nowrap end}} लिखी गई [[बूलियन तर्क]] अभिव्यक्ति लिखा गया को लिस्प के एस-एक्सपीआर-आधारित उपसर्ग अंकन में {{nowrap begin}}<code>(= 4 (+ 2 2))</code>{{nowrap end}} के रूप में दर्शाया गया है। | अतः लिस्प में स्रोत कोड का प्रतिनिधित्व करते समय, एस-अभिव्यक्ति का प्रथम अवयव सामान्यतः ऑपरेटर या फ़ंक्शन का नाम होता है और किसी भी शेष अवयवों को तर्कों के रूप में माना जाता है। इसे उपसर्ग अंकन या [[पोलिश संकेतन|पोलिश अंकन]] कहा जाता है। उदाहरण के रूप में, C (प्रोग्रामिंग लैंग्वेज) में {{nowrap begin}}<code>4 == (2 + 2)</code>{{nowrap end}} लिखी गई [[बूलियन तर्क]] अभिव्यक्ति लिखा गया को लिस्प के एस-एक्सपीआर-आधारित उपसर्ग अंकन में {{nowrap begin}}<code>(= 4 (+ 2 2))</code>{{nowrap end}} के रूप में दर्शाया गया है। | ||
जैसा ऊपर बताया गया है, परमाणु की यथार्थ परिभाषा एलआईएसपी जैसी भाषाओं में भिन्न होती है। उद्धृत स्ट्रिंग में सामान्यतः उद्धरण के अतिरिक्त कुछ भी हो सकता है, जबकि एक गैर-उद्धृत पहचानकर्ता परमाणु में सामान्यतः उद्धरण, रिक्त स्थान के कैरैक्टर, लघु कोष्ठक, कोष्ठक, धनुर्कोष्ठक, बैकस्लैश और अर्धविराम के अतिरिक्त कुछ भी हो सकता है। किसी भी स्थिति में, निषिद्ध कैरैक्टर को सामान्यतः पूर्ववर्ती बैकस्लैश से बचकर सम्मिलित किया जा सकता है। यूनिकोड समर्थन भिन्न होता है। | जैसा ऊपर बताया गया है, परमाणु की यथार्थ परिभाषा एलआईएसपी जैसी भाषाओं में भिन्न होती है। इस प्रकार से उद्धृत स्ट्रिंग में सामान्यतः उद्धरण के अतिरिक्त कुछ भी हो सकता है, जबकि एक गैर-उद्धृत पहचानकर्ता परमाणु में सामान्यतः उद्धरण, रिक्त स्थान के कैरैक्टर, लघु कोष्ठक, कोष्ठक, धनुर्कोष्ठक, बैकस्लैश और अर्धविराम के अतिरिक्त कुछ भी हो सकता है। किसी भी स्थिति में, निषिद्ध कैरैक्टर को सामान्यतः पूर्ववर्ती बैकस्लैश से बचकर सम्मिलित किया जा सकता है। यूनिकोड समर्थन भिन्न होता है। | ||
एस-एक्सपीआर परिभाषा की पुनरावर्ती स्थिति परंपरागत रूप से कॉन कोष्ठकों का उपयोग करके कार्यान्वित किया जाता है। | इस प्रकार से एस-एक्सपीआर परिभाषा की पुनरावर्ती स्थिति परंपरागत रूप से कॉन कोष्ठकों का उपयोग करके कार्यान्वित किया जाता है। | ||
एस-अभिव्यक्ति मूल रूप से मात्र [[ एम-अभिव्यक्ति |एम-अभिव्यक्ति]] द्वारा अन्तःक्षेप किए जाने वाले डेटा के लिए अभिप्रेत थे, परन्तु लिस्प का प्रथम कार्यान्वयन एम-अभिव्यक्ति के एस-अभिव्यक्ति एन्कोडिंग का इंटरप्रेटर था, और लिस्प प्रोग्रामर शीघ्र ही दोनों कोड और डेटा के लिए एस-अभिव्यक्ति का उपयोग करने के प्रवृत्त हो गए। इसका अर्थ है कि लिस्प समजातीय है; अर्थात्, प्रोग्रामों का प्राथमिक प्रतिनिधित्व भी आदिम प्रकार की भाषा में डेटा संरचना है। | एस-अभिव्यक्ति मूल रूप से मात्र [[ एम-अभिव्यक्ति |एम-अभिव्यक्ति]] द्वारा अन्तःक्षेप किए जाने वाले डेटा के लिए अभिप्रेत थे, परन्तु लिस्प का प्रथम कार्यान्वयन एम-अभिव्यक्ति के एस-अभिव्यक्ति एन्कोडिंग का इंटरप्रेटर था, और लिस्प प्रोग्रामर शीघ्र ही दोनों कोड और डेटा के लिए एस-अभिव्यक्ति का उपयोग करने के प्रवृत्त हो गए। इसका अर्थ है कि लिस्प समजातीय है; अर्थात्, प्रोग्रामों का प्राथमिक प्रतिनिधित्व भी आदिम प्रकार की भाषा में डेटा संरचना है। | ||
Line 43: | Line 43: | ||
=== डेटा एस-अभिव्यक्ति के उदाहरण === | === डेटा एस-अभिव्यक्ति के उदाहरण === | ||
नीडित सूचियों को एस-अभिव्यक्ति के रूप में लिखा जा सकता है: <code>((milk juice) (honey marmalade))</code> दो-अवयव एस-अभिव्यक्ति है जिसके अवयव भी दो-अवयव एस-अभिव्यक्ति हैं। लिस्प (और यह आलेख) में प्रयुक्त व्हाइटस्पेस-पृथक अंकन सामान्य है। पंक्ति विराम (न्यूलाइन कैरैक्टर) सामान्यतः विभाजक के रूप में योग्य होते हैं। | इस प्रकार से नीडित सूचियों को एस-अभिव्यक्ति के रूप में लिखा जा सकता है: <code>((milk juice) (honey marmalade))</code> दो-अवयव एस-अभिव्यक्ति है जिसके अवयव भी दो-अवयव एस-अभिव्यक्ति हैं। लिस्प (और यह आलेख) में प्रयुक्त व्हाइटस्पेस-पृथक अंकन सामान्य है। अतः पंक्ति विराम (न्यूलाइन कैरैक्टर) सामान्यतः विभाजक के रूप में योग्य होते हैं। | ||
यह एस-अभिव्यक्ति (गज़दार/मेलिश, लिस्प में प्राकृतिक भाषा प्रसंस्करण) के रूप में लिखे गए अंग्रेजी के छोटे से उपसमुच्चय के लिए सरल संदर्भ-मुक्त व्याकरण है, जहां S = वाक्य, NP = संज्ञा वाक्यांश, VP = क्रिया वाक्यांश, V = क्रिया : | इस प्रकार से यह एस-अभिव्यक्ति (गज़दार/मेलिश, लिस्प में प्राकृतिक भाषा प्रसंस्करण) के रूप में लिखे गए अंग्रेजी के छोटे से उपसमुच्चय के लिए सरल संदर्भ-मुक्त व्याकरण है, जहां S = वाक्य, NP = संज्ञा वाक्यांश, VP = क्रिया वाक्यांश, V = क्रिया आदि हैं: | ||
<syntaxhighlight lang="lisp"> | <syntaxhighlight lang="lisp"> | ||
(((S) (NP VP)) | (((S) (NP VP)) | ||
Line 68: | Line 68: | ||
(* x (factorial (- x 1))))) | (* x (factorial (- x 1))))) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
फ़ंक्शन READ का उपयोग करके एस-अभिव्यक्ति को लिस्प में पढ़ा जा सकता है। READ एस-अभिव्यक्ति के टेक्स्टुअल प्रतिनिधित्व को पढ़ता है और लिस्प डेटा लौटाता है। फ़ंक्शन PRINT का उपयोग एस-अभिव्यक्ति को आउटपुट करने के लिए किया जा सकता है। आउटपुट तब फ़ंक्शन READ के साथ पढ़ा जा सकता है, जब सभी मुद्रित डेटा ऑब्जेक्ट में पठनीय प्रतिनिधित्व होता है। लिस्प में संख्याओं, स्ट्रिंग, प्रतीकों, सूचियों और कई अन्य डेटा प्रकारों के लिए पठनीय निरूपण हैं। PPRINT फ़ंक्शन का उपयोग करके प्रोग्राम कोड को सुंदर मुद्रित एस-अभिव्यक्ति के रूप में निरूपित किया जा सकता है (नोट: दो Ps के साथ, ''सुंदर''-प्रिंट के लिए छोटा)। | अतः फ़ंक्शन READ का उपयोग करके एस-अभिव्यक्ति को लिस्प में पढ़ा जा सकता है। इस प्रकार से READ एस-अभिव्यक्ति के टेक्स्टुअल प्रतिनिधित्व को पढ़ता है और लिस्प डेटा लौटाता है। फ़ंक्शन PRINT का उपयोग एस-अभिव्यक्ति को आउटपुट करने के लिए किया जा सकता है। अतः आउटपुट तब फ़ंक्शन READ के साथ पढ़ा जा सकता है, जब सभी मुद्रित डेटा ऑब्जेक्ट में पठनीय प्रतिनिधित्व होता है। लिस्प में संख्याओं, स्ट्रिंग, प्रतीकों, सूचियों और कई अन्य डेटा प्रकारों के लिए पठनीय निरूपण हैं। PPRINT फ़ंक्शन का उपयोग करके प्रोग्राम कोड को सुंदर मुद्रित एस-अभिव्यक्ति के रूप में निरूपित किया जा सकता है (नोट: दो Ps के साथ, ''सुंदर''-प्रिंट के लिए छोटा)। | ||
लिस्प प्रोग्राम वैध एस-अभिव्यक्ति हैं, परन्तु सभी एस-अभिव्यक्ति मान्य लिस्प प्रोग्राम नहीं हैं। <code>(1.0 + 3.1)</code> वैध एस-अभिव्यक्ति है, परन्तु वैध लिस्प प्रोग्राम नहीं है, क्योंकि लिस्प उपसर्ग अंकन का उपयोग करता है और चल बिन्दु संख्या (यहां 1.0) ऑपरेशन (अभिव्यक्ति का प्रथम अवयव) के रूप में मान्य नहीं है। | इस प्रकार से लिस्प प्रोग्राम वैध एस-अभिव्यक्ति हैं, परन्तु सभी एस-अभिव्यक्ति मान्य लिस्प प्रोग्राम नहीं हैं। <code>(1.0 + 3.1)</code> वैध एस-अभिव्यक्ति है, परन्तु वैध लिस्प प्रोग्राम नहीं है, क्योंकि लिस्प उपसर्ग अंकन का उपयोग करता है और चल बिन्दु संख्या (यहां 1.0) ऑपरेशन (अभिव्यक्ति का प्रथम अवयव) के रूप में मान्य नहीं है। | ||
एकल उद्धरण चिह्न से पहले एस-अभिव्यक्ति, जैसा कि <code>'x</code>में है, इस स्थिति में <code>(quote x)</code> लिस्प (प्रोग्रामिंग भाषा) के लिए वाक्यात्मक सुगर है। | एकल उद्धरण चिह्न से पहले एस-अभिव्यक्ति, जैसा कि <code>'x</code>में है, इस स्थिति में <code>(quote x)</code> लिस्प (प्रोग्रामिंग भाषा) के लिए वाक्यात्मक सुगर है। | ||
== पार्सिंग == | == पार्सिंग == | ||
एस-अभिव्यक्ति की तुलना प्रायः एक्सएमएल से की जाती है: मुख्य अंतर यह है कि एस-अभिव्यक्ति में मात्र प्रकार का कंटेनमेंट होता है, बिंदीदार युग्म, जबकि एक्सएमएल टैग में सरल गुण, अन्य टैग या [[सीडीएटीए]] हो सकते हैं, प्रत्येक अलग-अलग सिंटैक्स का उपयोग करता है। सरल उपयोग की स्थितियों के लिए, एस-अभिव्यक्ति एक्सएमएल की तुलना में सरल हैं, परन्तु अधिक उन्नत उपयोग की स्थितियों के लिए, एक्सएमएल में क्वेरी भाषा है जिसे [[XPath|एक्सपथ]] कहा जाता है, एक्सएमएल डेटा के प्रबंधन को सरल बनाने के लिए कई उपकरण और तृतीय पक्ष लाइब्रेरी हैं। | अतः एस-अभिव्यक्ति की तुलना प्रायः एक्सएमएल से की जाती है: मुख्य अंतर यह है कि एस-अभिव्यक्ति में मात्र प्रकार का कंटेनमेंट होता है, बिंदीदार युग्म, जबकि एक्सएमएल टैग में सरल गुण, अन्य टैग या [[सीडीएटीए]] हो सकते हैं, प्रत्येक अलग-अलग सिंटैक्स का उपयोग करता है। इस प्रकार से सरल उपयोग की स्थितियों के लिए, एस-अभिव्यक्ति एक्सएमएल की तुलना में सरल हैं, परन्तु अधिक उन्नत उपयोग की स्थितियों के लिए, एक्सएमएल में क्वेरी भाषा है जिसे [[XPath|एक्सपथ]] कहा जाता है, एक्सएमएल डेटा के प्रबंधन को सरल बनाने के लिए कई उपकरण और तृतीय पक्ष लाइब्रेरी हैं। | ||
== मानकीकरण == | == मानकीकरण == | ||
कुछ लिस्प-व्युत्पन्न प्रोग्रामिंग भाषाओं के मानकों में उनके एस-अभिव्यक्ति सिंटैक्स के लिए विनिर्देश सम्मिलित है। इनमें सामान्य लिस्प (एएनएसआई मानक डॉक्यूमेंट एएनएसआई आईएनसीआईटीएस 226-1994 (R2004)), स्कीम (प्रोग्रामिंग भाषा) (आर5आरएस और [[R6RS|आर6आरएस]])<ref>{{Cite journal|title=Revised6 Report on the Algorithmic Language Scheme|date=Aug 12, 2009|journal=Journal of Functional Programming|volume=19|issue=S1|pages=1–301|doi=10.1017/S0956796809990074|last1=Sperber|first1=Michael|last2=Dybvig|first2=R. Kent|last3=Flatt|first3=Matthew|last4=Van Straaten|first4=Anton|last5=Findler|first5=Robby|last6=Matthews|first6=Jacob|citeseerx=10.1.1.372.373}}</ref>), और आईएसएलआईएसपी सम्मिलित हैं। | कुछ लिस्प-व्युत्पन्न प्रोग्रामिंग भाषाओं के मानकों में उनके एस-अभिव्यक्ति सिंटैक्स के लिए विनिर्देश सम्मिलित है। इस प्रकार से इनमें सामान्य लिस्प (एएनएसआई मानक डॉक्यूमेंट एएनएसआई आईएनसीआईटीएस 226-1994 (R2004)), स्कीम (प्रोग्रामिंग भाषा) (आर5आरएस और [[R6RS|आर6आरएस]])<ref>{{Cite journal|title=Revised6 Report on the Algorithmic Language Scheme|date=Aug 12, 2009|journal=Journal of Functional Programming|volume=19|issue=S1|pages=1–301|doi=10.1017/S0956796809990074|last1=Sperber|first1=Michael|last2=Dybvig|first2=R. Kent|last3=Flatt|first3=Matthew|last4=Van Straaten|first4=Anton|last5=Findler|first5=Robby|last6=Matthews|first6=Jacob|citeseerx=10.1.1.372.373}}</ref>), और आईएसएलआईएसपी सम्मिलित हैं। | ||
=== रिवेस्ट का संस्करण === | === रिवेस्ट का संस्करण === | ||
{{See also|विहित एस-अभिव्यक्ति}} | {{See also|विहित एस-अभिव्यक्ति}} | ||
मई 1997 में, [[रॉन रिवेस्ट]] ने आरएफसी के रूप में प्रकाशन के लिए विचार करने के लिए [[इंटरनेट ड्राफ्ट]] प्रस्तुत किया।<ref>[https://web.archive.org/web/20230223024606/http://people.csail.mit.edu/rivest/Sexp.txt S-expressions], Network Working Group, Internet Draft, Expires November 4, 1997 - R. Rivest, May 4, 1997 draft-rivest-sexp-00.txt, Ronald L. Rivest, CSAIL MIT website</ref> ड्राफ्ट ने लिस्प एस-अभिव्यक्ति पर आधारित सिंटैक्स को परिभाषित किया परन्तु विशेष रूप से प्रोग्रामिंग के अतिरिक्त सामान्य-उद्देश्य डेटा भंडारण और विनिमय (एक्सएमएल के समान) के लिए अभिप्रेत है। इसे कभी भी आरएफसी के रूप में स्वीकृत नहीं किया गया था, परन्तु तब से इसे अन्य आरएफसी (जैसे [ | इस प्रकार से मई 1997 में, [[रॉन रिवेस्ट]] ने आरएफसी के रूप में प्रकाशन के लिए विचार करने के लिए [[इंटरनेट ड्राफ्ट]] प्रस्तुत किया।<ref>[https://web.archive.org/web/20230223024606/http://people.csail.mit.edu/rivest/Sexp.txt S-expressions], Network Working Group, Internet Draft, Expires November 4, 1997 - R. Rivest, May 4, 1997 draft-rivest-sexp-00.txt, Ronald L. Rivest, CSAIL MIT website</ref> ड्राफ्ट ने लिस्प एस-अभिव्यक्ति पर आधारित सिंटैक्स को परिभाषित किया परन्तु विशेष रूप से प्रोग्रामिंग के अतिरिक्त सामान्य-उद्देश्य डेटा भंडारण और विनिमय (एक्सएमएल के समान) के लिए अभिप्रेत है। आरएफसी इसे कभी भी आरएफसी के रूप में स्वीकृत नहीं किया गया था, परन्तु तब से इसे अन्य आरएफसी (जैसे [आरएफसी:2693 आरएफसी 2693]) और कई अन्य प्रकाशनों द्वारा उद्धृत और उपयोग किया जाता है।<ref>[https://scholar.google.com/scholar?hl=en&lr=&safe=off&q=rivest+sexp&btnG=Search rivest sexp], Google Scholar (search)</ref> यह मूल रूप से [[सरल सार्वजनिक कुंजी अवसंरचना]] में उपयोग के लिए अभिप्रेत था। | ||
रिवेस्ट का प्रारूप एस-अभिव्यक्ति को अष्टक-स्ट्रिंग ([[बाइट]] की श्रृंखला) या अन्य एस-अभिव्यक्ति की सीमित सूची के रूप में परिभाषित करता है। यह इस संरचना को व्यक्त करने के लिए तीन इंटरचेंज प्रारूपों का वर्णन करता है। उन्नत अभिगम है, जो प्रारूपण के स्थिति में बहुत नम्य है, और वाक्यात्मक रूप से लिस्प-शैली के अभिव्यक्तियों के समान है, परन्तु वे समान नहीं हैं। उन्नत अभिगम, उदाहरण के लिए, अष्टक-स्ट्रिंग को शब्दशः निष्पादित करने की अनुमति देता है (स्ट्रिंग की लंबाई कोलन और पूर्ण प्राकृतिक स्ट्रिंग के बाद), उद्धृत प्रारूप जो एस्केप कैरेक्टर, [[हेक्साडेसिमल]], [[बेस 64]] की अनुमति देता है, या यदि यह कुछ प्रतिबन्धों को पूरा करता है तो इसे प्रत्यक्षतः टोकन के रूप में रखा जाता है। (रिवेस्ट के टोकन लिस्प टोकन से भिन्न होते हैं जिसमें पूर्व मात्र सुविधा और सौंदर्यशास्त्र के लिए होते हैं, और अन्य स्ट्रिंग के जैसे ही व्यवहार किए जाते हैं, जबकि बाद वाले का विशिष्ट वाक्यात्मक अर्थ होता है।) | अतः रिवेस्ट का प्रारूप एस-अभिव्यक्ति को अष्टक-स्ट्रिंग ([[बाइट]] की श्रृंखला) या अन्य एस-अभिव्यक्ति की सीमित सूची के रूप में परिभाषित करता है। यह इस संरचना को व्यक्त करने के लिए तीन इंटरचेंज प्रारूपों का वर्णन करता है। इस प्रकार से उन्नत अभिगम है, जो प्रारूपण के स्थिति में बहुत नम्य है, और वाक्यात्मक रूप से लिस्प-शैली के अभिव्यक्तियों के समान है, परन्तु वे समान नहीं हैं। उन्नत अभिगम, उदाहरण के लिए, अष्टक-स्ट्रिंग को शब्दशः निष्पादित करने की अनुमति देता है (स्ट्रिंग की लंबाई कोलन और पूर्ण प्राकृतिक स्ट्रिंग के बाद), उद्धृत प्रारूप जो एस्केप कैरेक्टर, [[हेक्साडेसिमल]], [[बेस 64]] की अनुमति देता है, या यदि यह कुछ प्रतिबन्धों को पूरा करता है तो इसे प्रत्यक्षतः टोकन के रूप में रखा जाता है। (अतः रिवेस्ट के टोकन लिस्प टोकन से भिन्न होते हैं जिसमें पूर्व मात्र सुविधा और सौंदर्यशास्त्र के लिए होते हैं, और अन्य स्ट्रिंग के जैसे ही व्यवहार किए जाते हैं, जबकि बाद वाले का विशिष्ट वाक्यात्मक अर्थ होता है।) | ||
रिवेस्ट का प्रारूप डिजिटल हस्ताक्षर उद्देश्यों के लिए [[कैनोनिकल एस-एक्सप्रेशन|कैनोनिकल एस-अभिव्यक्ति]] को परिभाषित करता है। इसका उद्देश्य कॉम्पैक्ट होना है, पार्स करना सरल है, और किसी अमूर्त एस-अभिव्यक्ति के लिए अद्वितीय है। यह मात्र वर्बैटिम स्ट्रिंग की अनुमति देता है, और बाह्य स्ट्रिंग को निरूपित करने के रूप में व्हाइटस्पेस को प्रतिबंधित करता है। अंत में मूल अभिगम प्रतिनिधित्व है, जो या तो विहित रूप है या बेस64 के समान एन्कोडेड है और [[ब्रैकेट]] से घिरा हुआ है, बाद वाली पद्धति में कैनोनिक रूप से एन्कोडेड एस-अभिव्यक्ति को सुरक्षित रूप से अभिगम करने का अभिप्राय रखता है जो स्पेसिंग को परिवर्तित कर सकता है (उदाहरण के लिए ईमेल पद्धति जो 80-कैरैक्टर-चौड़ी रेखाएँ हैं और इससे अधिक कुछ भी वलयित करता है)। | इस प्रकार से रिवेस्ट का प्रारूप डिजिटल हस्ताक्षर उद्देश्यों के लिए [[कैनोनिकल एस-एक्सप्रेशन|कैनोनिकल एस-अभिव्यक्ति]] को परिभाषित करता है। इसका उद्देश्य कॉम्पैक्ट होना है, पार्स करना सरल है, और किसी अमूर्त एस-अभिव्यक्ति के लिए अद्वितीय है। यह मात्र वर्बैटिम स्ट्रिंग की अनुमति देता है, और बाह्य स्ट्रिंग को निरूपित करने के रूप में व्हाइटस्पेस को प्रतिबंधित करता है। अंत में मूल अभिगम प्रतिनिधित्व है, जो या तो विहित रूप है या बेस64 के समान एन्कोडेड है और [[ब्रैकेट]] से घिरा हुआ है, बाद वाली पद्धति में कैनोनिक रूप से एन्कोडेड एस-अभिव्यक्ति को सुरक्षित रूप से अभिगम करने का अभिप्राय रखता है जो स्पेसिंग को परिवर्तित कर सकता है (उदाहरण के लिए ईमेल पद्धति जो 80-कैरैक्टर-चौड़ी रेखाएँ हैं और इससे अधिक कुछ भी वलयित करता है)। | ||
यह प्रारूप एसपीकेआई के बाह्य उपयोग के लिए व्यापक रूप से अनुकूलित नहीं किया गया है (कुछ उपयोगकर्ता [[GnuPG|जीएनयूपीजी]], लिबजीक्रिप्ट, नेटल (क्रिप्टोग्राफ़िक लाइब्रेरी) और [[GNU|जीएनयू]] आईएसएह हैं)। रिवेस्ट का एस-अभिव्यक्ति वेब पृष्ठ पार्सर और जनरेटर ([[मेरा लाइसेंस]] के अंतर्गत उपलब्ध) के लिए सी (प्रोग्रामिंग भाषा) स्रोत कोड प्रदान करता है, जिसे अन्य प्रोग्रामों में अनुकूलित और एम्बेड किया जा सकता है।<ref>{{Cite web|url=https://web.archive.org/web/20230223024606/http://people.csail.mit.edu/rivest/Sexp.txt|title=SEXP (एस-एक्सप्रेशन)|website=people.csail.mit.edu}}</ref> इसके अतिरिक्त, प्रारूप को स्वतंत्र रूप से लागू करने पर कोई प्रतिबंध नहीं है। | अतः यह प्रारूप एसपीकेआई के बाह्य उपयोग के लिए व्यापक रूप से अनुकूलित नहीं किया गया है (कुछ उपयोगकर्ता [[GnuPG|जीएनयूपीजी]], लिबजीक्रिप्ट, नेटल (क्रिप्टोग्राफ़िक लाइब्रेरी) और [[GNU|जीएनयू]] आईएसएह हैं)। इस प्रकार से रिवेस्ट का एस-अभिव्यक्ति वेब पृष्ठ पार्सर और जनरेटर ([[मेरा लाइसेंस]] के अंतर्गत उपलब्ध) के लिए सी (प्रोग्रामिंग भाषा) स्रोत कोड प्रदान करता है, जिसे अन्य प्रोग्रामों में अनुकूलित और एम्बेड किया जा सकता है।<ref>{{Cite web|url=https://web.archive.org/web/20230223024606/http://people.csail.mit.edu/rivest/Sexp.txt|title=SEXP (एस-एक्सप्रेशन)|website=people.csail.mit.edu}}</ref> इसके अतिरिक्त, प्रारूप को स्वतंत्र रूप से लागू करने पर कोई प्रतिबंध नहीं है। | ||
== यह भी देखें == | == यह भी देखें == |
Revision as of 20:28, 27 June 2023
कंप्यूटर प्रोग्रामिंग में, एस-अभिव्यक्ति (या प्रतीकात्मक अभिव्यक्ति, जिसे सेक्सपीआर या सेक्सपी के रूप में संक्षिप्त किया गया है) नीडित सूची (कंप्यूटिंग) (ट्री डेटा संरचना) डेटा के लिए समान नाम वाले अंकन में अभिव्यक्ति है। प्रोग्रामिंग भाषा लिस्प (प्रोग्रामिंग भाषा) के लिए एस-अभिव्यक्ति का आविष्कार किया गया था और इसे लोकप्रिय बनाया गया था, जो उन्हें स्रोत कोड के साथ-साथ डेटा के लिए भी उपयोग करता है।
लिस्प के सामान्य संश्लेषित सिंटेक्स (प्रोग्रामिंग भाषाएं) में, एस-अभिव्यक्ति को शास्त्रीय रूप से परिभाषित किया गया है[1] जैसा की दर्शया गया है
x
रूप का परमाणु, या(x . y)
रूप की अभिव्यक्ति (कंप्यूटर विज्ञान) जहां x और y एस-अभिव्यक्ति हैं।
इस प्रकार से यह परिभाषा कोशिकाओं की श्रृंखला के रूप में सूची के लिस्प के प्रतिनिधित्व को दर्शाती है, प्रत्येक क्रमित युग्म है। साधारण सूचियों में, y आगमी कोष्ठिका (यदि कोई हो) की ओर संकेत करता है, इस प्रकार संलग्न सूची बनाता है। परिभाषा के पुनरावर्ती अनुच्छेद का अर्थ है कि यह प्रतिनिधित्व और एस-अभिव्यक्ति अंकन दोनों ही किसी भी बाइनरी ट्री का प्रतिनिधित्व कर सकते हैं। यद्यपि, प्रतिनिधित्व सैद्धांतिक रूप से परिपत्र संदर्भों की अनुमति दे सकता है, ऐसी स्थितियों में संरचना निश्चित ही ट्री नहीं है, परन्तु चक्रीय ग्राफ है, और शास्त्रीय एस-अभिव्यक्ति अंकन में इसका प्रतिनिधित्व नहीं किया जा सकता है जब तक कि प्रति संदर्भ के लिए अंकन प्रदान नहीं किया जाता है (एसक्यूएल विदेशी कुंजी, एसजीएमएल/एक्सएमएल आईडीआरईएफ, आदि के अनुरूप)। इस प्रकार से सामान्य लिस्प [2] और स्कीम (प्रोग्रामिंग भाषा)[3] जैसी आधुनिक लिस्प उपभाषा डेटाम लेबल के माध्यम से ऐसा सिंटैक्स प्रदान करती हैं, जिसके साथ ऑब्जेक्टओं को चिह्नित किया जा सकता है, जिसे बाद में कहीं और दोहराया जा सकता है, जो फिर द्विगुणित संरचना के अतिरिक्त साझा को इंगित करना, जिससे लिस्प पाठक या प्रारूप (सामान्य लिस्प) को पता लगाने में सक्षम बनाना और इस प्रकार असीमित पुनरावृत्ति के बिना चक्रों के मूल्यांकन या निष्पादन को ट्रिगर करना था
#n=(x y . #n#)
इस प्रकार से एक परमाणु की परिभाषा संदर्भ के अनुसार परिवर्तित होती रहती है; जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) द्वारा मूल परिभाषा में,[1] यह माना गया था कि अलग-अलग प्रतीकों (प्रोग्रामिंग) का अनंत समुच्चय स्थित था, जिसे लैटिन लिपियों और एकल एम्बेडेड रिक्त स्थान (कैरैक्टर स्ट्रिंग (कंप्यूटिंग) और संख्यात्मक शाब्दिक (कंप्यूटर प्रोग्रामिंग) का एक उपसमुच्चय) वाले अंकों की श्रृंखला के रूप में दर्शाया गया था।
अतः अधिकांश आधुनिक सेक्सपीआर अंकन अधिक सामान्य उद्धृत स्ट्रिंग (उदाहरण के लिए विराम चिह्न या पूर्ण यूनिकोड सहित) की अनुमति देते हैं, और 2 से अधिक सदस्यों के साथ सूचियों का प्रतिनिधित्व करने के लिए संक्षिप्त अंकन का उपयोग करते हैं, ताकि
(x y z)
अतः इसका अर्थ है कि
(x . (y . (z . NIL)))
NIL
विशेष अंत-सूची ऑब्जेक्ट (कंप्यूटर विज्ञान) है (वैकल्पिक रूप लिखित ()
, जो स्कीम (प्रोग्रामिंग भाषा) में एकमात्र प्रतिनिधित्व है[4])।
इस प्रकार से प्रोग्रामिंग भाषाओं के लिस्प वर्ग में, स्रोत कोड और डेटा दोनों का प्रतिनिधित्व करने के लिए एस-अभिव्यक्ति का उपयोग किया जाता है। एस-अभिव्यक्ति के अन्य उपयोग डॉक्यूमेंट शैली शब्दार्थ और विशिष्टता भाषा जैसी लिस्प-व्युत्पन्न भाषाओं में हैं, और इंटरनेट संदेश एक्सेस प्रोटोकॉल और जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के सामान्य व्यापार संचार भाषा जैसे संचार प्रोटोकॉल में मार्क-अप के रूप में हैं। इसका उपयोग वेब असेंबली के पाठ प्रतिनिधित्व के रूप में भी किया जाता है। अतः सिंटैक्स और समर्थित डेटा प्रकारों का विवरण अलग-अलग भाषाओं में भिन्न होता है, परन्तु इन भाषाओं में सबसे सामान्य विशेषता एस-अभिव्यक्ति और प्रीफ़िक्स अंकन का उपयोग है।
डेटाटाइप और सिंटैक्स
अतः एस-अभिव्यक्ति प्रारूप के कई प्रकार हैं, जो विभिन्न डेटाटाइप के लिए विभिन्न सिंटैक्स का समर्थन करते हैं। इस प्रकार से सबसे व्यापक रूप से समर्थित हैं:
- सूचियाँ और जोड़े:
(1 () (2 . 3) (4))
- प्रतीक:
with-hyphen
?@!$
|a symbol with spaces|
- स्ट्रिंग:
"Hello, world!"
- पूर्णांक:
-9876543210
- दशमलव संख्याएं:
-0.0
6.28318
6.022e23
इस प्रकार से कैरैक्टर #
का उपयोग प्रायः सिंटैक्स में एक्सटेंशन उपसर्ग करने के लिए किया जाता है, उदाहरण के लिए हेक्साडेसिमल पूर्णांकों के लिए #x10
हेक्साडेसिमल या कैरैक्टरों के लिए #\C
है।
लिस्प में प्रयोग
अतः लिस्प में स्रोत कोड का प्रतिनिधित्व करते समय, एस-अभिव्यक्ति का प्रथम अवयव सामान्यतः ऑपरेटर या फ़ंक्शन का नाम होता है और किसी भी शेष अवयवों को तर्कों के रूप में माना जाता है। इसे उपसर्ग अंकन या पोलिश अंकन कहा जाता है। उदाहरण के रूप में, C (प्रोग्रामिंग लैंग्वेज) में 4 == (2 + 2)
लिखी गई बूलियन तर्क अभिव्यक्ति लिखा गया को लिस्प के एस-एक्सपीआर-आधारित उपसर्ग अंकन में (= 4 (+ 2 2))
के रूप में दर्शाया गया है।
जैसा ऊपर बताया गया है, परमाणु की यथार्थ परिभाषा एलआईएसपी जैसी भाषाओं में भिन्न होती है। इस प्रकार से उद्धृत स्ट्रिंग में सामान्यतः उद्धरण के अतिरिक्त कुछ भी हो सकता है, जबकि एक गैर-उद्धृत पहचानकर्ता परमाणु में सामान्यतः उद्धरण, रिक्त स्थान के कैरैक्टर, लघु कोष्ठक, कोष्ठक, धनुर्कोष्ठक, बैकस्लैश और अर्धविराम के अतिरिक्त कुछ भी हो सकता है। किसी भी स्थिति में, निषिद्ध कैरैक्टर को सामान्यतः पूर्ववर्ती बैकस्लैश से बचकर सम्मिलित किया जा सकता है। यूनिकोड समर्थन भिन्न होता है।
इस प्रकार से एस-एक्सपीआर परिभाषा की पुनरावर्ती स्थिति परंपरागत रूप से कॉन कोष्ठकों का उपयोग करके कार्यान्वित किया जाता है।
एस-अभिव्यक्ति मूल रूप से मात्र एम-अभिव्यक्ति द्वारा अन्तःक्षेप किए जाने वाले डेटा के लिए अभिप्रेत थे, परन्तु लिस्प का प्रथम कार्यान्वयन एम-अभिव्यक्ति के एस-अभिव्यक्ति एन्कोडिंग का इंटरप्रेटर था, और लिस्प प्रोग्रामर शीघ्र ही दोनों कोड और डेटा के लिए एस-अभिव्यक्ति का उपयोग करने के प्रवृत्त हो गए। इसका अर्थ है कि लिस्प समजातीय है; अर्थात्, प्रोग्रामों का प्राथमिक प्रतिनिधित्व भी आदिम प्रकार की भाषा में डेटा संरचना है।
डेटा एस-अभिव्यक्ति के उदाहरण
इस प्रकार से नीडित सूचियों को एस-अभिव्यक्ति के रूप में लिखा जा सकता है: ((milk juice) (honey marmalade))
दो-अवयव एस-अभिव्यक्ति है जिसके अवयव भी दो-अवयव एस-अभिव्यक्ति हैं। लिस्प (और यह आलेख) में प्रयुक्त व्हाइटस्पेस-पृथक अंकन सामान्य है। अतः पंक्ति विराम (न्यूलाइन कैरैक्टर) सामान्यतः विभाजक के रूप में योग्य होते हैं।
इस प्रकार से यह एस-अभिव्यक्ति (गज़दार/मेलिश, लिस्प में प्राकृतिक भाषा प्रसंस्करण) के रूप में लिखे गए अंग्रेजी के छोटे से उपसमुच्चय के लिए सरल संदर्भ-मुक्त व्याकरण है, जहां S = वाक्य, NP = संज्ञा वाक्यांश, VP = क्रिया वाक्यांश, V = क्रिया आदि हैं:
(((S) (NP VP))
((VP) (V))
((VP) (V NP))
((V) died)
((V) employed)
((NP) nurses)
((NP) patients)
((NP) Medicenter)
((NP) "Dr Chan"))
सोर्स कोड एस-अभिव्यक्ति का उदाहरण
प्रोग्राम कोड एस-अभिव्यक्ति में लिखा जा सकता है, सामान्यतः प्रीफिक्स अंकन का उपयोग करते हुए।
इस प्रकार से सामान्य लिस्प में उदाहरण:
(defun factorial (x)
(if (zerop x)
1
(* x (factorial (- x 1)))))
अतः फ़ंक्शन READ का उपयोग करके एस-अभिव्यक्ति को लिस्प में पढ़ा जा सकता है। इस प्रकार से READ एस-अभिव्यक्ति के टेक्स्टुअल प्रतिनिधित्व को पढ़ता है और लिस्प डेटा लौटाता है। फ़ंक्शन PRINT का उपयोग एस-अभिव्यक्ति को आउटपुट करने के लिए किया जा सकता है। अतः आउटपुट तब फ़ंक्शन READ के साथ पढ़ा जा सकता है, जब सभी मुद्रित डेटा ऑब्जेक्ट में पठनीय प्रतिनिधित्व होता है। लिस्प में संख्याओं, स्ट्रिंग, प्रतीकों, सूचियों और कई अन्य डेटा प्रकारों के लिए पठनीय निरूपण हैं। PPRINT फ़ंक्शन का उपयोग करके प्रोग्राम कोड को सुंदर मुद्रित एस-अभिव्यक्ति के रूप में निरूपित किया जा सकता है (नोट: दो Ps के साथ, सुंदर-प्रिंट के लिए छोटा)।
इस प्रकार से लिस्प प्रोग्राम वैध एस-अभिव्यक्ति हैं, परन्तु सभी एस-अभिव्यक्ति मान्य लिस्प प्रोग्राम नहीं हैं। (1.0 + 3.1)
वैध एस-अभिव्यक्ति है, परन्तु वैध लिस्प प्रोग्राम नहीं है, क्योंकि लिस्प उपसर्ग अंकन का उपयोग करता है और चल बिन्दु संख्या (यहां 1.0) ऑपरेशन (अभिव्यक्ति का प्रथम अवयव) के रूप में मान्य नहीं है।
एकल उद्धरण चिह्न से पहले एस-अभिव्यक्ति, जैसा कि 'x
में है, इस स्थिति में (quote x)
लिस्प (प्रोग्रामिंग भाषा) के लिए वाक्यात्मक सुगर है।
पार्सिंग
अतः एस-अभिव्यक्ति की तुलना प्रायः एक्सएमएल से की जाती है: मुख्य अंतर यह है कि एस-अभिव्यक्ति में मात्र प्रकार का कंटेनमेंट होता है, बिंदीदार युग्म, जबकि एक्सएमएल टैग में सरल गुण, अन्य टैग या सीडीएटीए हो सकते हैं, प्रत्येक अलग-अलग सिंटैक्स का उपयोग करता है। इस प्रकार से सरल उपयोग की स्थितियों के लिए, एस-अभिव्यक्ति एक्सएमएल की तुलना में सरल हैं, परन्तु अधिक उन्नत उपयोग की स्थितियों के लिए, एक्सएमएल में क्वेरी भाषा है जिसे एक्सपथ कहा जाता है, एक्सएमएल डेटा के प्रबंधन को सरल बनाने के लिए कई उपकरण और तृतीय पक्ष लाइब्रेरी हैं।
मानकीकरण
कुछ लिस्प-व्युत्पन्न प्रोग्रामिंग भाषाओं के मानकों में उनके एस-अभिव्यक्ति सिंटैक्स के लिए विनिर्देश सम्मिलित है। इस प्रकार से इनमें सामान्य लिस्प (एएनएसआई मानक डॉक्यूमेंट एएनएसआई आईएनसीआईटीएस 226-1994 (R2004)), स्कीम (प्रोग्रामिंग भाषा) (आर5आरएस और आर6आरएस)[5]), और आईएसएलआईएसपी सम्मिलित हैं।
रिवेस्ट का संस्करण
इस प्रकार से मई 1997 में, रॉन रिवेस्ट ने आरएफसी के रूप में प्रकाशन के लिए विचार करने के लिए इंटरनेट ड्राफ्ट प्रस्तुत किया।[6] ड्राफ्ट ने लिस्प एस-अभिव्यक्ति पर आधारित सिंटैक्स को परिभाषित किया परन्तु विशेष रूप से प्रोग्रामिंग के अतिरिक्त सामान्य-उद्देश्य डेटा भंडारण और विनिमय (एक्सएमएल के समान) के लिए अभिप्रेत है। आरएफसी इसे कभी भी आरएफसी के रूप में स्वीकृत नहीं किया गया था, परन्तु तब से इसे अन्य आरएफसी (जैसे [आरएफसी:2693 आरएफसी 2693]) और कई अन्य प्रकाशनों द्वारा उद्धृत और उपयोग किया जाता है।[7] यह मूल रूप से सरल सार्वजनिक कुंजी अवसंरचना में उपयोग के लिए अभिप्रेत था।
अतः रिवेस्ट का प्रारूप एस-अभिव्यक्ति को अष्टक-स्ट्रिंग (बाइट की श्रृंखला) या अन्य एस-अभिव्यक्ति की सीमित सूची के रूप में परिभाषित करता है। यह इस संरचना को व्यक्त करने के लिए तीन इंटरचेंज प्रारूपों का वर्णन करता है। इस प्रकार से उन्नत अभिगम है, जो प्रारूपण के स्थिति में बहुत नम्य है, और वाक्यात्मक रूप से लिस्प-शैली के अभिव्यक्तियों के समान है, परन्तु वे समान नहीं हैं। उन्नत अभिगम, उदाहरण के लिए, अष्टक-स्ट्रिंग को शब्दशः निष्पादित करने की अनुमति देता है (स्ट्रिंग की लंबाई कोलन और पूर्ण प्राकृतिक स्ट्रिंग के बाद), उद्धृत प्रारूप जो एस्केप कैरेक्टर, हेक्साडेसिमल, बेस 64 की अनुमति देता है, या यदि यह कुछ प्रतिबन्धों को पूरा करता है तो इसे प्रत्यक्षतः टोकन के रूप में रखा जाता है। (अतः रिवेस्ट के टोकन लिस्प टोकन से भिन्न होते हैं जिसमें पूर्व मात्र सुविधा और सौंदर्यशास्त्र के लिए होते हैं, और अन्य स्ट्रिंग के जैसे ही व्यवहार किए जाते हैं, जबकि बाद वाले का विशिष्ट वाक्यात्मक अर्थ होता है।)
इस प्रकार से रिवेस्ट का प्रारूप डिजिटल हस्ताक्षर उद्देश्यों के लिए कैनोनिकल एस-अभिव्यक्ति को परिभाषित करता है। इसका उद्देश्य कॉम्पैक्ट होना है, पार्स करना सरल है, और किसी अमूर्त एस-अभिव्यक्ति के लिए अद्वितीय है। यह मात्र वर्बैटिम स्ट्रिंग की अनुमति देता है, और बाह्य स्ट्रिंग को निरूपित करने के रूप में व्हाइटस्पेस को प्रतिबंधित करता है। अंत में मूल अभिगम प्रतिनिधित्व है, जो या तो विहित रूप है या बेस64 के समान एन्कोडेड है और ब्रैकेट से घिरा हुआ है, बाद वाली पद्धति में कैनोनिक रूप से एन्कोडेड एस-अभिव्यक्ति को सुरक्षित रूप से अभिगम करने का अभिप्राय रखता है जो स्पेसिंग को परिवर्तित कर सकता है (उदाहरण के लिए ईमेल पद्धति जो 80-कैरैक्टर-चौड़ी रेखाएँ हैं और इससे अधिक कुछ भी वलयित करता है)।
अतः यह प्रारूप एसपीकेआई के बाह्य उपयोग के लिए व्यापक रूप से अनुकूलित नहीं किया गया है (कुछ उपयोगकर्ता जीएनयूपीजी, लिबजीक्रिप्ट, नेटल (क्रिप्टोग्राफ़िक लाइब्रेरी) और जीएनयू आईएसएह हैं)। इस प्रकार से रिवेस्ट का एस-अभिव्यक्ति वेब पृष्ठ पार्सर और जनरेटर (मेरा लाइसेंस के अंतर्गत उपलब्ध) के लिए सी (प्रोग्रामिंग भाषा) स्रोत कोड प्रदान करता है, जिसे अन्य प्रोग्रामों में अनुकूलित और एम्बेड किया जा सकता है।[8] इसके अतिरिक्त, प्रारूप को स्वतंत्र रूप से लागू करने पर कोई प्रतिबंध नहीं है।
यह भी देखें
- कॉन
- सीएआर और सीडीआर
- फेक्सपीआर
- लैम्ब्डा गणना
- एम-अभिव्यक्ति
- विहित एस-अभिव्यक्ति
- डेटा क्रमांकन प्रारूपों की तुलना
संदर्भ
- ↑ 1.0 1.1 John McCarthy (1960/2006). Recursive functions of symbolic expressions Archived 2004-02-02 at the Wayback Machine. Originally published in Communications of the ACM.
- ↑ "Common Lisp HyperSpec: 22.4 - The Printer Dictionary: *PRINT-CIRCLE*". 2018-12-28.
- ↑ "Revised7 Report on the Algorithmic Language Scheme: Section 2.4: Datum Labels" (PDF). 2013-07-06.
- ↑ "Revised^5 Report on the Algorithmic Language Scheme". schemers.org.
- ↑ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; Findler, Robby; Matthews, Jacob (Aug 12, 2009). "Revised6 Report on the Algorithmic Language Scheme". Journal of Functional Programming. 19 (S1): 1–301. CiteSeerX 10.1.1.372.373. doi:10.1017/S0956796809990074.
- ↑ S-expressions, Network Working Group, Internet Draft, Expires November 4, 1997 - R. Rivest, May 4, 1997 draft-rivest-sexp-00.txt, Ronald L. Rivest, CSAIL MIT website
- ↑ rivest sexp, Google Scholar (search)
- ↑ "SEXP (एस-एक्सप्रेशन)". people.csail.mit.edu.
बाह्यी संबंध
- sfsexp the small, fast एस-expression library for C/C++ on GitHub
- miniलिस्प, by Léon Bottou.
- एस-expressions on Rosettacode has implementations of readers and writers in many languages.