2010-11-16 6 views
12

इस समारोह लें:एलआईएसपी डिफ्यून को इसके पैरामीटर तर्क से पहले उद्धरण की आवश्यकता क्यों नहीं है?

(defun sum-greater (x y z) 
(> (+ x y) z)) 

यह मेरी समझ है कि लिस्प में एक सूची में पहले तत्व हमेशा एक समारोह के बाद के परमाणुओं/सूचियों पर करने का प्रतिनिधित्व करता है। तो y और z पर किए जाने वाले फ़ंक्शन के रूप में (x y z) में LISP क्यों x का इलाज नहीं करता है। स्पष्ट रूप से यह वांछनीय व्यवहार नहीं होगा, लेकिन यह अपेक्षित व्यवहार होगा।

संभावित रूप से defun परिभाषित करने वाला फ़ंक्शन किसी सूची के मानक LISP मूल्यांकन को ओवरराइड करता है? यदि हां, तो क्या आप इसका विस्तार कर सकते हैं?

धन्यवाद

+3

यह अपने सभी अन्य तर्कों पर भी मूल्यांकन में देरी करता है: आप निश्चित रूप से 'defun' रूप का मूल्यांकन करते समय' (> ...) 'मूल्यांकन नहीं करना चाहते हैं! – Ken

+0

अच्छा बिंदु, मुझे पता होना चाहिए कि डिफुन अकेले से नियमित कार्य से अधिक था .. –

उत्तर

8

कॉमन लिस्प कम से कम defun में IIRC एक मैक्रो (HyperSpec), जिसका अर्थ यह अपने तर्कों के लिए किसी भी मूल्यांकन रणनीति को परिभाषित कर सकते है।

+1

आह सही, यह समझ में आता है। मैं अभी तक मेरी LISP पुस्तक के मैक्रो अध्याय तक नहीं पहुंच पाया है। एफवाईआई - इस जवाब को चुना क्योंकि यह सबसे संक्षिप्त है, लेकिन सभी को धन्यवाद। Emacs Lisp में –

3

आपकी धारणा सही है। Defun आमतौर पर special form या macro

+1

, लेकिन आम लिस्प में नहीं। वहां यह एक मैक्रो है। –

+2

मैंने आपकी टिप्पणी से पहले जवाब संपादित किया। लेकिन आप काफी सही थे। –

6

defun विशेष है क्योंकि यह एक मैक्रो है। और चूंकि मैक्रोज़ कार्यान्वयन पर निर्भर हो सकते हैं, इसलिए ब्लैक जादू के सभी प्रकार हुड के नीचे हो सकते हैं।

लिस्प हाइपरस्पेक (सामान्य लिस्प) says, और मैंने उद्धृत किया: "मैक्रो विस्तार समय पर किसी भी तर्क का मूल्यांकन नहीं किया जाता है"।

3

आप यहाँ लिस्प में एक बुनियादी परिचय डाउनलोड कर सकते हैं:

Common Lisp: A Gentle Introduction to Symbolic Computation, by David S. Touretzky

लिस्प और विशेष रूप से कॉमन लिस्प कई लिस्प रूप हैं:

  • समारोह

  • मैक्रो कॉल

  • विशेष रूपों

DEFUN एक मैक्रो है कहता है। इस प्रकार मैक्रो परिभाषित करता है कि कौन से भागों का मूल्यांकन किया जाता है और जो नहीं। एएनएसआई कॉमन लिस्प के लिए यह मानक में परिभाषित किया गया है और डेफन मैक्रो द्वारा कार्यान्वित किया गया है।

2

डिफ्यून एक समारोह नहीं है, लेकिन एक विशेष रूप (या एक से उबाल जाता है), और इनके लिए, मूल्यांकन यांत्रिकी अलग-अलग हैं। इसी प्रकार के उदाहरण होंगे, जहां तर्कों में से एक को मूल्यांकन किए बिना पूरी तरह से त्याग दिया जाता है!

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