2010-11-13 21 views
5

लिस्प में, एक प्रतीक एक ही समय में एक मूल्य और एक समारोह के लिए बाध्य किया जा सकता है। उदाहरण के लिए,एक प्रतीक का लाभ क्या है जो एक ही समय में मूल्य और कार्य से जुड़ा होता है?

प्रतीक च एक समारोह

(defun f(x) 
    (* 2 x)) 

प्रतीक च एक मूल्य के लिए बाध्य करने के लिए बाध्य

(setq f 10) 

तो मैं कुछ इस तरह लिखना:

(f f) 

=> 20

ऐसी सुविधा का लाभ क्या है?

+3

तर्क और गेब्रियल के लिस्प -1/लिस्प -2 पेपर के लिंक पर पहले से ही चर्चा की गई है [सामान्य लिस्प बनाम योजनाओं में कार्यों और चर के लिए अलग-अलग नामस्थान] (http://stackoverflow.com/questions/1020968/separate- नामस्थान-फॉर-फ़ंक्शंस-एंड-वेरिएबल्स-इन-कॉमन-लिस्प-बनाम-स्कीम) –

+0

@Pete: लिंक के लिए धन्यवाद। मैंने अपना प्रश्न पोस्ट करने से पहले इस विषय की खोज की लेकिन किसी भी तरह से मैंने इसे याद किया। –

उत्तर

12

प्रतीक में एक कार्य और मूल्य दोनों हो सकते हैं। फ़ंक्शन SYMBOL-FUNCTION और SYMBOL-VALUE के साथ मान के साथ पुनर्प्राप्त किया जा सकता है।

यह पूरा दृश्य नहीं है। सामान्य लिस्प में (कम से कम) दो नामस्थान होते हैं, एक फंक्शंस के लिए और एक चर के लिए। वैश्विक प्रतीकों में भाग लेते हैं। लेकिन स्थानीय कार्यों के लिए प्रतीक शामिल नहीं हैं।

  • कार्य करता है और चर के लिए पहचानकर्ता के बीच कोई नाम संघर्ष:

    तो फायदे क्या हैं।

    योजना: (परिभाषित करते हैं (foo lst) (सूची lst))

    CL: (defun foo (सूची) (सूची सूची))

  • कोई क्रम जाँच करता है कि वास्तव में कुछ एक समारोह है

    योजना: (परिभाषित करते हैं (foo) (बार))

    CL: (defun foo() (बार))

    योजना में यह स्पष्ट नहीं है कि बार क्या है। यह एक संख्या हो सकती है और इससे खाद्य को कॉल करते समय रनटाइम त्रुटि हो सकती है।

    सीएल बार में या तो एक समारोह या अपरिभाषित है। यह कभी और कुछ नहीं हो सकता है। यह उदाहरण के लिए एक संख्या कभी नहीं हो सकता है। फ़ंक्शन नाम को किसी संख्या में बांधना संभव नहीं है, इस प्रकार इस मामले को रनटाइम पर कभी भी चेक करने की आवश्यकता नहीं है।

-1

यह रोजमर्रा के कार्यों के लिए उपयोगी है, लेकिन मुख्य कारण मैक्रोज़ के कारण है, आप समझेंगे कि एक बार जब आप इसका अध्ययन करेंगे।

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