2010-12-27 10 views
10

मैं लिस्प कार्यक्रमों की व्याख्या/संकलन के दौरान "पाठक" के कार्यों के बारे में सोच रहा हूं, या शायद अधिक सही ढंग से।लिस्प व्याख्या के दौरान "पाठक" के कार्य क्या हैं?

मैंने पहले से किए गए पूर्व-प्रश्न-शोध से, ऐसा लगता है कि एक पाठक (विशेष रूप से इस मामले में क्लोजर) को "सिंटैक्टिक प्रीप्रोसेसर" के रूप में माना जा सकता है। यह मुख्य कर्तव्यों पाठक मैक्रोज़ और आदिम रूपों का विस्तार है। तो, दो उदाहरण:

'cheese   --> (quote cheese) 
{"a" 1 "b" 2} --> (array-map "a" 1 "b" 2) 

तो पाठक एक प्रोग्राम (के एस-भाव मिलकर) के पाठ में ले जाता है और फिर बनाता है और एक में स्मृति डेटा संरचना है कि सीधे मूल्यांकन किया जा सकता देता है।

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

धन्यवाद!

उत्तर

20

आम तौर पर लिस्प में पाठक एस-एक्सप्रेशन पढ़ता है और डेटा संरचनाएं देता है। पढ़ें एक I/O ऑपरेशन है: इनपुट वर्णों की एक धारा है और आउटपुट लिस्प डेटा है।

प्रिंटर विपरीत है: यह लिस्प डेटा लेता है और उन्हें अक्षरों की धारा के रूप में आउटपुट करता है। इस प्रकार यह लिस्प डेटा को बाहरी एस-एक्सप्रेशन में भी प्रिंट कर सकता है।

ध्यान दें कि व्याख्या का अर्थ कुछ विशिष्ट है: एक इंटरप्रेटर द्वारा कोड निष्पादित करना। लेकिन कई लिस्प सिस्टम (क्लोजर समेत) एक कंपाइलर का उपयोग कर रहे हैं। लिस्प फॉर्म के लिए मान की गणना करने के कार्यों को आमतौर पर मूल्यांकन कहा जाता है। मूल्यांकन संकलन द्वारा या दोनों के मिश्रण द्वारा व्याख्या द्वारा कार्यान्वित किया जा सकता है।

एस-अभिव्यक्ति: प्रतीकात्मक अभिव्यक्तियां। डेटा का बाहरी, पाठपरक प्रतिनिधित्व। बाहरी अर्थ यह है कि एस-अभिव्यक्तियां आप पाठ फ़ाइलों, तारों आदि में देखते हैं। इसलिए एस-अभिव्यक्ति कुछ, आमतौर पर बाहरी, मध्यम पर वर्णों से बना होती है।

लिस्प डेटा संरचनाओं: प्रतीकों, सूचियों, तार, संख्याओं, वर्णों, ...

रीडर: पढ़ता एस भाव और लिस्प डेटा संरचनाओं देता है।

ध्यान दें कि एस-एक्सप्रेशन का उपयोग लिस्प स्रोत कोड को एन्कोड करने के लिए भी किया जाता है।

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

एस-अभिव्यक्ति डेटा संरचनाओं के लिए बाहरी वाक्यविन्यास प्रदान करती है।

लिस्प प्रोग्राम एस-एक्सप्रेशन का उपयोग कर बाहरी रूप में लिखे गए हैं।लेकिन सभी एस-एक्सप्रेशन वैध लिस्प प्रोग्राम नहीं हैं:

(if a b c d e) is usually not a valid Lisp program 

लिस्प के सिंटैक्स आमतौर पर लिस्प डेटा के शीर्ष पर परिभाषित किया जाता है।

if test-form then-form [else-form] 

तो यह एक परीक्षण-रूप है, एक तो फार्म और एक वैकल्पिक और कुछ फार्म की उम्मीद:

अगर उदाहरण के लिए निम्न सिंटैक्स (कॉमन लिस्प http://www.lispworks.com/documentation/HyperSpec/Body/s_if.htm में) है।

के रूप में एस भाव निम्न वैध अगर अभिव्यक्ति कर रहे हैं:

(if (foo) 1 2) 
(if (bar) (foo)) 

लेकिन चूंकि लिस्प कार्यक्रमों रूप हैं, हम भी लिस्प प्रोग्राम का उपयोग इन रूपों का निर्माण कर सकते हैं:

(सूची 'अगर' (foo) 1 2) एक लिस्प प्रोग्राम है जो वैध आईएफ फॉर्म देता है।

CL-USER 24 > (describe (list 'if '(foo) 1 2)) 

(IF (FOO) 1 2) is a LIST 
0  IF 
1  (FOO) 
2  1 
3  2 

यह सूची उदाहरण के लिए EVAL के साथ निष्पादित की जा सकती है। ईवीएएल सूची रूपों की अपेक्षा करता है - एस-एक्सप्रेशन नहीं। याद रखें एस-एक्सप्रेशन केवल एक बाहरी प्रतिनिधित्व है। एक लिस्प फॉर्म बनाने के लिए, हमें इसे पढ़ने की जरूरत है।

यही कारण है कि यह कहा जाता है कोड डेटा है। लिस्प फॉर्म को आंतरिक लिस्प डेटा संरचनाओं के रूप में व्यक्त किया जाता है: सूचियां, प्रतीकों, संख्याओं, तारों, .... अधिकांश अन्य प्रोग्रामिंग भाषाओं में कोड कच्चा पाठ होता है। लिस्प एस-एक्सप्रेशन में कच्चे टेक्स्ट हैं। फ़ंक्शन रीड के साथ पढ़ते समय, एस-एक्सप्रेशन डेटा में बदल जाते हैं।

इस प्रकार लिस्प में मूल इंटरैक्शन शीर्ष-स्तर को आरईपीएल कहा जाता है, इवल प्रिंट लूप पढ़ें। एक पाश है कि बार-बार एक रों अभिव्यक्ति पढ़ता है, तुतलाना प्रपत्र और प्रिंट यह मूल्यांकन करता है:

READ : s-expression -> lisp data 
EVAL : lisp form -> resulting lisp data 
PRINT: lisp data -> s-expression 

तो सबसे आदिम आरईपीएल है:

(loop (print (eval (read)))) 
इस प्रकार देखने के एक वैचारिक बिंदु से

, अपने प्रश्न का उत्तर देने के लिए, मूल्यांकन के दौरान पाठक कुछ भी नहीं करता है। यह मूल्यांकन में शामिल नहीं है। मूल्यांकन ईवीएएल द्वारा किया जाता है। पाठक को पढ़ने के लिए कॉल द्वारा बुलाया जाता है। चूंकि ईवीएएल लिस्प डेटा संरचनाओं को इनपुट (और एस-एक्सप्रेशन नहीं) के रूप में उपयोग करता है, इसलिए पाठक लिस्प फॉर्म का मूल्यांकन करने से पहले चला जाता है (उदाहरण के लिए व्याख्या द्वारा या संकलन करके और इसे निष्पादित करके)।

+3

अच्छा स्पष्टीकरण के लिए धन्यवाद। तो, कोई कह सकता है कि पाठक प्रोग्राम डेटा में एस-एक्सप्रेशन के रूप में संरचित सादे-पाठ के रूप में पढ़ता है और एक लिस्प डेटा संरचना देता है। यह किसी भी अभिव्यक्ति का मूल्यांकन नहीं करता है, लेकिन बस उन्हें स्मृति में ऐसे तरीके से प्रस्तुत करता है जिसका मूल्यांकन प्रभावी ढंग से किया जा सकता है? मैं अब और अधिक स्पष्ट रूप से एक मूल्यांकनकर्ता के बीच अंतर देख रहा हूं (एसआईसीपी के "मेटासिर्कुलर अबास्ट्रक्शन" अध्याय के अनुसार जिसमें एक सरल लिस्प-इन-लिस्प मूल्यांकनकर्ता प्रस्तुत किया जाता है) और एक पूर्णतः दुभाषिया। – Andrew

+4

@ एंड्रयू: ठीक है। आम तौर पर पाठक चीजों का मूल्यांकन नहीं करता है। यह एस-अभिव्यक्ति के लिए बस एक लिस्प डेटा संरचना बनाता है। अब एक मूल्यांकनकर्ता इन आंतरिक डेटास्ट्रक्चर की व्याख्या कर सकता है - लेक्सर चरण पहले से ही किया जा चुका है। अक्सर इन कार्यक्रमों को डेटा के रूप में एक मध्यवर्ती चरण में मशीन या बाइट कोड में संकलित किया जाता है। ध्यान दें कि उदाहरण के लिए आम लिस्प पाठक की चीजों का मूल्यांकन करने की सुविधा है। '(1 2 #। (+ 1 2)) रिटर्न (1 2 3)। #। एक पाठक मैक्रो है जो पढ़ने के समय पर अगली अभिव्यक्ति का मूल्यांकन करता है। कोई भी पढ़ने योग्य तालिकाओं के माध्यम से अतिरिक्त व्यवहार को लागू कर सकता है। –