2013-06-16 5 views
16

के बाद से कॉमन लिस्प के समारोह तर्क बाएँ-से-सही क्रम, क्यों एक साधारण समारोह का उपयोग नहीं होता में मूल्यांकन?आम लिस्प: क्यों प्रोन एक विशेष रूप है?</p> <pre><code>(defun progn2 (&rest body) (first (last body))) </code></pre> विशेष रूप के बजाय <p>:

+1

'defun' पहले से ही एक अंतर्निहित' progn' शामिल नहीं है? 'Defun' के मैक्रो विस्तार की जांच करें। – tuscland

+5

दोनों @ एसडीएस और @ रेनर जोस्विग के उत्तरों महत्वपूर्ण अंक बनाते हैं। @ एसडीएस के उत्तर में 'मान' कुछ ऐसा है जो आप थोड़ी देर में पकड़ सकते हैं, और व्यवहार जो @RainerJoswig का वर्णन करता है वह बहुत महत्वपूर्ण है, खासकर जब आप अपने स्रोत में मैक्रो-आधारित शीर्ष-स्तरीय रूप डालने लगते हैं; यदि ये फॉर्म से अधिक उत्पादन करते हैं जिन्हें शीर्ष-स्तर के रूप में माना जाना चाहिए, तो आपको 'progn' की आवश्यकता है। –

उत्तर

24

वहाँ भी PROGN का एक और विशेषता है जो आपको एक समारोह के साथ नहीं मिल सकता है:

कॉमन लिस्प कोड का एक फ़ाइल में इस कोड की कल्पना कीजिए:

(progn 
    (defmacro foo())) 

बनाम

(my-progn 
    (defmacro foo())) 

PROGN का उपयोग करने के साथ संकलक DEFMACRO फ़ॉर्म को शीर्ष-स्तरीय रूप के रूप में देखेगा। इसका मतलब है कि उदाहरण के लिए कि कंपाइलर नोट करता है कि एक मैक्रो परिभाषा है और इसे संकलन-समय पर्यावरण में उपलब्ध कराती है।

फ़ंक्शन MY-PROGN का उपयोग करके, कंपाइलर DEFMACRO फ़ॉर्म को पहचान नहीं पाएगा, क्योंकि यह शीर्ष-स्तर पर नहीं है।

+3

क्या 'शीर्ष-स्तरीय-फॉर्म' का अर्थ है? – 1ambda

22

progn रिटर्न पिछले प्रपत्र यह मूल्यांकन करता है के सभी मूल्यों, अपने कार्य सिर्फ पहले एक रिटर्न:

कि
(progn (values 1 2 3)) 
=> 1, 2, 3 
(progn2 (values 1 2 3)) 
=> 1 

progn (रेनर पहले से उल्लेख किया) का एक अन्य महत्वपूर्ण सुविधा है यह अपने सभी रूपों रहता top-level , जो मैक्रोज़ को एकाधिक रूपों में विस्तारित करना संभव बनाता है (उदाहरण के लिए, "“value returned is unused” warning when byte-compiling a macro" पर मेरा उत्तर)।

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