2010-04-29 11 views
9

फिलहाल मैं पीटर सेबेल से "प्रैक्टिकल कॉमन लिस्प" के माध्यम से काम कर रहा हूं।LISP: कीवर्ड पैरामीटर, आपूर्ति-पी

अध्याय में

(defun foo (&key a (b 20) (c 30 c-p)) (list a b c c-p)) 

परिणाम::

(foo :a 1 :b 2 :c 3) ==> (1 2 3 T) 
(foo :c 3 :b 2 :a 1) ==> (1 2 3 T) 
(foo :a 1 :c 3)  ==> (1 20 3 T) 
(foo)     ==> (NIL 20 30 NIL) 

"प्रैक्टिकल: एक साधारण डेटाबेस" (http://www.gigamonkeys.com/book/practical-a-simple-database.html) Seibel कीवर्ड मापदंडों और निम्न उदाहरण के साथ एक आपूर्ति पैरामीटर के उपयोग बताते हैं इसलिए यदि मैं अपनी पैरामीटर सूची की शुरुआत में & कुंजी का उपयोग करता हूं, तो मुझे पैरामीटर की आपूर्ति या नहीं होने पर 3 पैरामीटर नाम, डिफ़ॉल्ट मान और तीसरे की सूची का उपयोग करने की संभावना है। ठीक। लेकिन ऊपर के उदाहरण में कोड देख:

(list a b c c-p) 

तुतलाना दुभाषिया कैसे पता है कि सी पी मेरी "आपूर्ति पैरामीटर" है?

उत्तर

14

के समारोह foo reindent करते हैं: एक, बी और सी:

(defun foo (&key a 
       (b 20) 
       (c 30 c-p)) 
    (list a b c c-p)) 

आप इसे इस प्रकार इंडेंट यदि आप समारोह तीन कीवर्ड पैरामीटर है कि देखेंगे। ये समारोह के शरीर में उपलब्ध हैं।

कीवर्ड पैरामीटर वहाँ एक चर रहा है के लिए घोषित सी पी कि टी या निर्भर करता है कि जब foo कहा जाता हो जाता है पारित किया गया है शून्य हो जाएगा।

  1. एक एकल चर नाम
  2. एक चर नाम की एक सूची और एक डिफ़ॉल्ट मान
  3. एक चर की एक सूची के रूप में:

    एक कीवर्ड पैरामीटर आम तौर पर निम्न विकल्पों में से एक के रूप में घोषित किया जा सकता नाम, एक डिफ़ॉल्ट मान और एक चर जो दिखाता है कि पैरामीटर पारित किया गया है या नहीं जब फ़ंक्शन को

आपूर्ति-पी विशेष रूप से दिलचस्प है

(defun make-my-array (size &key (init-value nil init-value-supplied-p)) 
    (if init-value-supplied-p 
     (make-array size :initial-element init-value) 
     (make-array size))) 

अब उपयोगकर्ता शून्य करने के लिए तत्वों init कर सकते हैं::

(make-my-array 10 :init-value nil) 

यहाँ डिफ़ॉल्ट मान और आपूर्ति मूल्य दोनों हो सकता है देखने के लिए कि मूल्य कॉल या डिफ़ॉल्ट मान से आता है चाहता है शून्य, लेकिन हमें एक फर्क पड़ने की जरूरत है। परिवर्तनीय init-value-supplied-p यह देखने में सक्षम बनाता है कि परिवर्तनीय init-value का शून्य मान डिफ़ॉल्ट या फ़ंक्शन कॉल से आता है या नहीं।

5

यह बताना मुश्किल है कि आप क्या पूछ रहे हैं। T या NIL से जुड़ा हुआ है, इस पर निर्भर करता है कि c पैरामीटर के रूप में प्रदान किया गया है या नहीं। यह बाध्यकारी तब समारोह के शरीर के लिए उपलब्ध है।

+1

आहा इसे मिला :-) सी-पी बस ए, बी और सी जैसी सूची में जोड़ा गया है और "एक सूची सेट/अनसेट" के लिए "आपूर्ति पैरामीटर" नहीं है। सिंटैक्स के आदी होने में कुछ समय लगता है, हालांकि यह वास्तव में आसान है। :-) धन्यवाद! – echox