एस-एक्सप्रेशन
कंप्यूटर प्रोग्रामिंग में, एक एस-एक्सप्रेशन (या प्रतीकात्मक अभिव्यक्ति, जिसे सेक्सप्र या सेक्सप के रूप में संक्षिप्त किया गया है) नेस्टेड सूची (कंप्यूटिंग) (ट्री (डेटा स्ट्रक्चर) -स्ट्रक्चर्ड) डेटा के लिए एक समान नाम वाले नोटेशन में एक अभिव्यक्ति है। प्रोग्रामिंग भाषा लिस्प (प्रोग्रामिंग भाषा) के लिए एस-एक्सप्रेशन का आविष्कार किया गया था और इसे लोकप्रिय बनाया गया था, जो उन्हें स्रोत कोड के साथ-साथ डेटा के लिए भी उपयोग करता है।
लिस्प के सामान्य संश्लेषित सिंटेक्स (प्रोग्रामिंग भाषाएं) में, एक एस-एक्सप्रेशन को शास्त्रीय रूप से परिभाषित किया गया है[1] जैसा
- रूप का एक परमाणु
x
, या - प्रपत्र की एक अभिव्यक्ति (कंप्यूटर विज्ञान)।
(x . y)
जहाँ x और y S-भाव हैं।
यह परिभाषा कोशिकाओं की एक श्रृंखला के रूप में एक सूची के LISP के प्रतिनिधित्व को दर्शाती है, प्रत्येक एक आदेशित जोड़ी है। सादी सूचियों में, y अगली सेल (यदि कोई हो) की ओर इशारा करता है, इस प्रकार एक लिंक्ड सूची बनाता है। परिभाषा के प्रत्यावर्तन क्लॉज का अर्थ है कि यह प्रतिनिधित्व और एस-एक्सप्रेशन नोटेशन दोनों ही किसी भी बाइनरी ट्री का प्रतिनिधित्व कर सकते हैं। हालांकि, प्रतिनिधित्व सैद्धांतिक रूप से परिपत्र संदर्भों की अनुमति दे सकता है, जिसमें संरचना एक पेड़ नहीं है, लेकिन एक चक्रीय ग्राफ है, और शास्त्रीय एस-अभिव्यक्ति संकेतन में प्रदर्शित नहीं किया जा सकता है जब तक क्रॉस-रेफरेंस के लिए एक सम्मेलन प्रदान नहीं किया जाता है (एसक्यूएल विदेशी कुंजी, एसजीएमएल/एक्सएमएल आईडीआरईएफ, आदि के अनुरूप)। आधुनिक लिस्प बोलियाँ जैसे सामान्य लिस्प [2] और योजना (प्रोग्रामिंग भाषा)[3] डेटाम लेबल के माध्यम से ऐसा सिंटैक्स प्रदान करें, जिसके साथ वस्तुओं को चिह्नित किया जा सकता है, जो फिर कहीं और दोहरा सकता है, डुप्लिकेट संरचना के बजाय साझा को इंगित करता है, जिससे लिस्प पाठक या प्रारूप (कॉमन लिस्प) का पता लगाने में सक्षम होता है और इस प्रकार असीम रूप से पुनरावृत्ति के बिना चक्रों के मूल्यांकन या प्रदर्शन को ट्रिगर करता है।
#n=(x y . #n#)
एक परमाणु की परिभाषा संदर्भ के अनुसार बदलती रहती है; जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) द्वारा मूल परिभाषा में,[1]यह मान लिया गया था कि अलग-अलग प्रतीक (प्रोग्रामिंग) का एक अनंत सेट मौजूद है, जो पूंजीगत लैटिन लिपियों और एकल एम्बेडेड रिक्त स्थान (स्ट्रिंग (कंप्यूटिंग) और न्यूमेरिक शाब्दिक (कंप्यूटर प्रोग्रामिंग) का एक सबसेट) के साथ अंकों के रूप में दर्शाया गया है।
अधिकांश आधुनिक सेक्सप्र नोटेशन अधिक सामान्य उद्धृत स्ट्रिंग्स (उदाहरण के लिए विराम चिह्न या पूर्ण यूनिकोड सहित) की अनुमति देते हैं, और 2 से अधिक सदस्यों के साथ सूचियों का प्रतिनिधित्व करने के लिए संक्षिप्त नोटेशन का उपयोग करते हैं, ताकि
(x y z)
के लिए खड़ा है
(x . (y . (z . NIL)))
NIL
विशेष एंड-ऑफ़-लिस्ट वस्तु (कंप्यूटर विज्ञान) है (वैकल्पिक रूप से लिखा गया है ()
, जो योजना (प्रोग्रामिंग भाषा) में एकमात्र प्रतिनिधित्व है[4]).
प्रोग्रामिंग भाषाओं के लिस्प परिवार में, स्रोत कोड और डेटा दोनों का प्रतिनिधित्व करने के लिए एस-एक्सप्रेशन का उपयोग किया जाता है। एस-एक्सप्रेशन के अन्य उपयोग लिस्प-व्युत्पन्न भाषाओं में हैं जैसे दस्तावेज़ शैली शब्दार्थ और विशिष्टता भाषा, और मार्कअप भाषा के रूप में। इंटरनेट संदेश एक्सेस प्रोटोकॉल और जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) की सामान्य व्यापार संचार भाषा जैसे संचार प्रोटोकॉल में मार्क-अप . इसका उपयोग WebAssembly के पाठ प्रतिनिधित्व के रूप में भी किया जाता है। सिंटैक्स और समर्थित डेटा प्रकारों का विवरण अलग-अलग भाषाओं में भिन्न होता है, लेकिन इन भाषाओं में सबसे आम विशेषता एस-एक्सप्रेशन और प्रीफ़िक्स नोटेशन का उपयोग है।
डेटाटाइप्स और सिंटैक्स
एस-एक्सप्रेशन प्रारूप के कई प्रकार हैं, जो विभिन्न डेटाटाइप्स के लिए विभिन्न सिंटैक्स का समर्थन करते हैं। सबसे व्यापक रूप से समर्थित हैं:
- सूचियाँ और जोड़े:
(1 () (2 . 3) (4))
- प्रतीक:
with-hyphen
?@!$
|a symbol with spaces|
- स्ट्रिंग्स:
"Hello, world!"
- पूर्णांक:
-9876543210
- दशमलव संख्याएं:
-0.0
6.28318
6.022e23
चरित्र #
सिंटैक्स में एक्सटेंशन को उपसर्ग करने के लिए अक्सर उपयोग किया जाता है, उदा। #x10
हेक्साडेसिमल पूर्णांकों के लिए, या #\C
पात्रों के लिए।
== लिस्प == में प्रयोग करें
लिस्प में स्रोत कोड का प्रतिनिधित्व करते समय, एस-एक्सप्रेशन का पहला तत्व आमतौर पर एक ऑपरेटर या फ़ंक्शन का नाम होता है और किसी भी शेष तत्वों को तर्कों के रूप में माना जाता है। इसे उपसर्ग संकेतन या पोलिश संकेतन कहा जाता है। उदाहरण के तौर पर, बूलियन तर्क एक्सप्रेशन लिखा गया है 4 == (2 + 2)
C (प्रोग्रामिंग लैंग्वेज) में, के रूप में दर्शाया गया है (= 4 (+ 2 2))
लिस्प के s-expr-आधारित उपसर्ग अंकन में।
जैसा ऊपर बताया गया है, परमाणु की सटीक परिभाषा एलआईएसपी जैसी भाषाओं में भिन्न होती है। एक उद्धृत स्ट्रिंग में आमतौर पर उद्धरण के अलावा कुछ भी हो सकता है, जबकि एक गैर-उद्धृत पहचानकर्ता परमाणु में आमतौर पर उद्धरण, खाली स्थान के वर्ण, कोष्ठक, कोष्ठक, कोष्ठक, बैकस्लैश और अर्धविराम के अलावा कुछ भी हो सकता है। किसी भी मामले में, एक निषिद्ध चरित्र को आमतौर पर पूर्ववर्ती बैकस्लैश से बचकर शामिल किया जा सकता है। यूनिकोड समर्थन भिन्न होता है।
एस-एक्सप्र परिभाषा का पुनरावर्ती मामला परंपरागत रूप से विपक्ष कोशिकाओं का उपयोग करके कार्यान्वित किया जाता है।
एस-एक्सप्रेशन मूल रूप से केवल एम-अभिव्यक्ति द्वारा हेरफेर किए जाने वाले डेटा के लिए अभिप्रेत थे, लेकिन लिस्प का पहला कार्यान्वयन एम-एक्सप्रेशन के एस-एक्सप्रेशन एन्कोडिंग का एक दुभाषिया था, और लिस्प प्रोग्रामर जल्द ही दोनों कोड के लिए एस-एक्सप्रेशन का उपयोग करने के आदी हो गए। और डेटा। इसका मतलब है कि लिस्प समजातीय है; अर्थात्, कार्यक्रमों का प्राथमिक प्रतिनिधित्व भी एक आदिम प्रकार की भाषा में एक डेटा संरचना है।
डेटा एस-एक्सप्रेशन के उदाहरण
नेस्टेड सूचियों को एस-एक्सप्रेशन के रूप में लिखा जा सकता है: ((milk juice) (honey marmalade))
एक दो-तत्व S-अभिव्यक्ति है जिसके तत्व भी दो-तत्व S-अभिव्यक्ति हैं। लिस्प (और यह आलेख) में प्रयुक्त व्हाइटस्पेस-पृथक संकेतन सामान्य है। पंक्ति विराम (न्यूलाइन वर्ण) आमतौर पर विभाजक के रूप में योग्य होते हैं।
यह एस-अभिव्यक्ति (गज़दार/मेलिश, लिस्प में प्राकृतिक भाषा प्रसंस्करण) के रूप में लिखे गए अंग्रेजी के एक छोटे से उपसमुच्चय के लिए एक सरल संदर्भ-मुक्त व्याकरण है, जहां एस = वाक्य, एनपी = संज्ञा वाक्यांश, वीपी = क्रिया वाक्यांश, वी = क्रिया :
(((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)))))
फ़ंक्शन रीड का उपयोग करके एस-एक्सप्रेशन को लिस्प में पढ़ा जा सकता है। रीड एस-एक्सप्रेशन के टेक्स्टुअल प्रतिनिधित्व को पढ़ता है और लिस्प डेटा लौटाता है। फ़ंक्शन PRINT का उपयोग S-एक्सप्रेशन को आउटपुट करने के लिए किया जा सकता है। आउटपुट तब फ़ंक्शन रीड के साथ पढ़ा जा सकता है, जब सभी मुद्रित डेटा ऑब्जेक्ट्स में एक पठनीय प्रतिनिधित्व होता है। लिस्प में संख्याओं, स्ट्रिंग्स, प्रतीकों, सूचियों और कई अन्य डेटा प्रकारों के लिए पठनीय निरूपण हैं। PPRINT फ़ंक्शन का उपयोग करके प्रोग्राम कोड को सुंदर मुद्रित एस-एक्सप्रेशन के रूप में स्वरूपित किया जा सकता है (नोट: दो Ps के साथ, सुंदर-प्रिंट के लिए छोटा)।
लिस्प प्रोग्राम वैध एस-एक्सप्रेशन हैं, लेकिन सभी एस-एक्सप्रेशन मान्य लिस्प प्रोग्राम नहीं हैं। (1.0 + 3.1)
एक वैध एस-एक्सप्रेशन है, लेकिन वैध लिस्प प्रोग्राम नहीं है, क्योंकि लिस्प उपसर्ग संकेतन का उपयोग करता है और एक फ्लोटिंग पॉइंट नंबर (यहां 1.0) एक ऑपरेशन (अभिव्यक्ति का पहला तत्व) के रूप में मान्य नहीं है।
एक एकल उद्धरण चिह्न से पहले एक एस-अभिव्यक्ति, जैसा कि 'x
, एक लिस्प (प्रोग्रामिंग भाषा) के लिए वाक्यात्मक चीनी है # स्व-मूल्यांकन रूपों और उद्धरण | उद्धृत एस-अभिव्यक्ति, इस मामले में (quote x)
.
पार्सिंग
एस-एक्सप्रेशन की तुलना अक्सर एक्सएमएल से की जाती है: मुख्य अंतर यह है कि एस-एक्सप्रेशन में केवल एक प्रकार का कंटेनमेंट होता है, बिंदीदार जोड़ी, जबकि एक्सएमएल टैग में सरल गुण, अन्य टैग या सीडीएटीए हो सकते हैं, प्रत्येक अलग-अलग सिंटैक्स का उपयोग करता है। सरल उपयोग के मामलों के लिए, एस-एक्सप्रेशन एक्सएमएल की तुलना में सरल हैं, लेकिन अधिक उन्नत उपयोग के मामलों के लिए, एक्सएमएल में एक क्वेरी भाषा है जिसे XPath कहा जाता है, एक्सएमएल डेटा के प्रबंधन को आसान बनाने के लिए कई टूल और थर्ड पार्टी लाइब्रेरी।
मानकीकरण
कुछ लिस्प-व्युत्पन्न प्रोग्रामिंग भाषाओं के मानकों में उनके एस-एक्सप्रेशन सिंटैक्स के लिए एक विनिर्देश शामिल है। इनमें कॉमन लिस्प (ANSI मानक दस्तावेज़ ANSI INCITS 226-1994 (R2004)), स्कीम (प्रोग्रामिंग भाषा) (R5RS और R6RS) शामिल हैं।[5]), और आईएसएलआईएसपी।
रिवेस्ट का संस्करण
मई 1997 में, रॉन रिवेस्ट ने एक इंटरनेट ड्राफ्ट प्रस्तुत किया[6] टिप्पणियों के अनुरोध के रूप में प्रकाशन के लिए विचार किया जाएगा। मसौदे ने लिस्प एस-एक्सप्रेशन पर आधारित एक सिंटैक्स को परिभाषित किया लेकिन विशेष रूप से प्रोग्रामिंग के बजाय सामान्य-उद्देश्य डेटा भंडारण और विनिमय (एक्सएमएल के समान) के लिए अभिप्रेत है। इसे कभी भी RFC के रूप में स्वीकृत नहीं किया गया था, लेकिन तब से इसे अन्य RFC (जैसे RFC 2693) और कई अन्य प्रकाशनों द्वारा उद्धृत और उपयोग किया जाता है।[7] यह मूल रूप से सरल सार्वजनिक कुंजी अवसंरचना में उपयोग के लिए अभिप्रेत था।
रिवेस्ट का प्रारूप एक एस-एक्सप्रेशन को ऑक्टेट-स्ट्रिंग (बाइट्स की एक श्रृंखला) या अन्य एस-एक्सप्रेशन की एक सीमित सूची के रूप में परिभाषित करता है। यह इस संरचना को व्यक्त करने के लिए तीन इंटरचेंज स्वरूपों का वर्णन करता है। एक उन्नत परिवहन है, जो स्वरूपण के मामले में बहुत लचीला है, और वाक्यात्मक रूप से लिस्प-शैली के भावों के समान है, लेकिन वे समान नहीं हैं। उन्नत परिवहन, उदाहरण के लिए, ऑक्टेट-स्ट्रिंग्स को शब्दशः प्रदर्शित करने की अनुमति देता है (स्ट्रिंग की लंबाई एक कोलन और पूरे कच्चे स्ट्रिंग के बाद), एक उद्धृत फॉर्म जो एस्केप कैरेक्टर, हेक्साडेसिमल, बेस 64 की अनुमति देता है, या सीधे टोकन के रूप में रखा जाता है यदि यह मिलता है कुछ शर्तें। (रिवेस्ट के टोकन लिस्प टोकन से भिन्न होते हैं जिसमें पूर्व सिर्फ सुविधा और सौंदर्यशास्त्र के लिए होते हैं, और अन्य स्ट्रिंग्स की तरह ही व्यवहार किए जाते हैं, जबकि बाद वाले का विशिष्ट वाक्यात्मक अर्थ होता है।)
रिवेस्ट का मसौदा डिजिटल हस्ताक्षर उद्देश्यों के लिए एक कैनोनिकल एस-एक्सप्रेशन को परिभाषित करता है। इसका उद्देश्य कॉम्पैक्ट होना है, पार्स करना आसान है, और किसी सार एस-अभिव्यक्ति के लिए अद्वितीय है। यह केवल वर्बैटिम स्ट्रिंग्स की अनुमति देता है, और बाहरी स्ट्रिंग्स को स्वरूपित करने के रूप में व्हाइटस्पेस को प्रतिबंधित करता है। अंत में मूल परिवहन प्रतिनिधित्व है, जो या तो विहित रूप है या बेस64 के समान एन्कोडेड है और ब्रैकेट से घिरा हुआ है, बाद वाला एक सिस्टम में कैनोनिक रूप से एन्कोडेड एस-अभिव्यक्ति को सुरक्षित रूप से परिवहन करने का इरादा रखता है जो रिक्ति को बदल सकता है (उदाहरण के लिए एक ईमेल सिस्टम जो 80-वर्ण-चौड़ी रेखाएँ हैं और इससे अधिक कुछ भी लपेटता है)।
यह प्रारूप SPKI के बाहर उपयोग के लिए व्यापक रूप से अनुकूलित नहीं किया गया है (कुछ उपयोगकर्ता GnuPG, libgcrypt, Nettle (क्रिप्टोग्राफ़िक लाइब्रेरी) और GNU lsh हैं)। रिवेस्ट का एस-एक्सप्रेशन वेब पेज एक पार्सर और जनरेटर (मेरा लाइसेंस के तहत उपलब्ध) के लिए सी (प्रोग्रामिंग भाषा) स्रोत कोड प्रदान करता है, जिसे अन्य कार्यक्रमों में अनुकूलित और एम्बेड किया जा सकता है।[8] इसके अलावा, प्रारूप को स्वतंत्र रूप से लागू करने पर कोई प्रतिबंध नहीं है।
यह भी देखें
- दोष
- कार और सीडीआर
- Fexpr
- लैम्ब्डा कैलकुलस
- एम-अभिव्यक्ति
- कैनोनिकल एस-एक्सप्रेशन
- डेटा क्रमांकन स्वरूपों की तुलना
संदर्भ
- ↑ 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 S-expression library for C/C++ on GitHub
- minilisp, by Léon Bottou.
- S-expressions on Rosettacode has implementations of readers and writers in many languages.