2010-03-29 2 views
6

आप जो कर सकते हैं उसके उदाहरण।क्या सीएलओएस के पास तारों पर एक ईक्ल विशेषज्ञता प्रेषण है?

(defmethod some-fn ((num real)) 
    (print "an integer")) 
(defmethod some-fn ((num real)) 
    (print "a real")) 
(defmethod some-fn ((num (eql 0))) 
    (print "zero")) 

(some-fn 19323923198319) 
"an integer" 
(some-fn 19323923198319.3) 
"a real" 
(some-fn 0) 
"zero" 

यह एक सामान्य 'स्ट्रिंग प्रकार के साथ भी काम करता है।

(defmethod some-fn ((num string)) 
    (print "a string")) 
(some-fn "asrt") 
"a string" 
एक विशिष्ट स्ट्रिंग के साथ

नहीं है, तथापि

(defmethod some-fn ((num (eql "A"))) 
    (print "a specifict string")))  
(some-fn "A") 
    => "A string" 

मैं कल्पना क्योंकि eql तरीका है कि आवश्यक होगा यह काम करने के लिए तार पर काम नहीं करता यह काम नहीं करता।

(eql "a" "a") => nil 

क्या ऐसा करने का कोई तरीका है?

उत्तर

7

लघु जवाब के साथ कहेंगे: हाँ , यह है।

लांग जवाब:

आप ने लिखा है:

(defmethod some-fn ((num (eql "A")) (print "a specifict string"))) 
=> doesn't compile 

क्योंकि आप वाक्य रचना गलत मिला है यही कारण है कि। यह होना चाहिए:

(defmethod some-fn ((num (eql "A"))) (print "a specific string")) 
=> does compile 

कौन सा आम तौर पर इस प्रारूप में उपलब्ध है:

(defmethod some-fn ((num (eql "A"))) 
    (print "a specifict string")) 

आप इसे इस तरह से प्रारूप और अपने पसंदीदा संपादक के अंतर्निहित खरोज उपकरण का उपयोग करते हैं, तो आप देखेंगे कि खरोज दिखता है

(defmethod some-fn ((num (eql "A")) 
        (print "a specifict string"))) 

यह भी संकलक द्वारा दिखाए गए त्रुटि संदेश को समझने की कोशिश करने में मदद कर सकते हैं: अपने कोड के लिए गलत।

वापस विषय के लिए:

आप CLOS में EQL प्रेषण के लिए किसी अन्य लिस्प वस्तु के रूप में तार का उपयोग कर सकते हैं।

यह सिर्फ इतना है कि "ए" और ईक्यूएल की तरह कई संभव तार हैं जो पहचान के लिए तुलना करते हैं (संख्याओं और पात्रों के लिए अपवाद के साथ)। ईक्यूएल तारों की तुलना उनके पात्रों से नहीं करता है।

आमतौर पर (ईक्यूएल "ए" "ए") शून्य लौटाता है। (साइड नोट: वास्तव में संकलक द्वारा संकलित कोड में यह अभिव्यक्ति सैद्धांतिक रूप से टी हो सकती है क्योंकि संकलक को संकलित कोड में स्थान बचाने के लिए डेटा ऑब्जेक्ट का पुन: उपयोग करने की अनुमति है।यहाँ हम शाब्दिक तार, डेटा वस्तुओं आप कमांड लाइन

(some-fn "A") 

यह EQL प्रेषण ट्रिगर नहीं करेगा पर डाल देते हैं तो कर सकते है।)

लेकिन इस उम्मीद के रूप में काम करता है:

(defparameter *a-string* "A") 

(defmethod some-fn ((num (eql *a-string*))) 
    (print "a specific string"))) 

और फिर

(some-fn *a-string*) 

तुम्हें यकीन चर एक मूल्य है कि बनाने की जरूरत है। चर का मूल्यांकन किया जाता है, जब DEFMETHOD रूप का मैक्रो विस्तार मूल्यांकन किया जाता है। मान तब ऑब्जेक्ट है जिसका उपयोग ईक्यूएल प्रेषण के लिए किया जाता है।

जैसा कि डिर्क ने अपने उत्तर में उल्लेख किया है, कोई प्रतीक का उपयोग कर सकता है। प्रतीकों का उद्देश्य यह है कि (ईक्यूएल '| ए |' | ए |) आमतौर पर टी। सिग्नल पढ़ने की प्रक्रिया के दौरान ईक्यू बनाते हैं।

सारांश: तार से अधिक

EQL प्रेषण CLOS में काम करता है। व्यावहारिक उपयोग के लिए, आपको EQL, स्ट्रिंग के संदर्भ में फ़ंक्शन को उसी के साथ कॉल करने की आवश्यकता है।

+0

ओपीएस। वाक्यविन्यास त्रुटि भी नोटिस नहीं किया था। अच्छी पकड़। तकनीकी रूप से, एक ही स्ट्रिंग इंस्टेंस का उपयोग करते हुए (जैसा कि "एक ही सामग्री वाले स्ट्रिंग" के विपरीत) कुछ प्रकार के इंटर्निंग/मैन्युअल रूप से एकजुट करने के लिए होता है, यदि आपके स्ट्रिंग बाहरी स्रोतों से आते हैं (कहें, फ़ाइल या किसी ऐसे से पढ़ें) जो शायद यहां अव्यवहारिक सादा तारों का उपयोग करके प्रस्तुत करें। – Dirk

+0

हाँ, मैंने इसे गलत कॉपी किया। मैं emacs आदि का उपयोग कर रहा हूँ ... यह एक दोस्त से एक सवाल था कि मैं जवाब नहीं दे सका। मुझे इसे ठीक करने के लिए defparam के उपयोग पसंद है। क्या वह पूरी तरह से पोर्टेबल है? – mhb

+0

@ एमएचबी: हाँ, यह पोर्टेबल होना चाहिए –

4

दुर्भाग्य से जहां तक ​​मुझे पता है। तुलना के लिए eql विशेषज्ञ केवल eql का उपयोग करता है (जो अनिवार्य रूप से तारों के लिए सूचक सूचकांक है)। तारों की सामग्री की तुलना करने के लिए, आपको equal (या equalp) विशेषज्ञ की आवश्यकता होगी, जो मौजूद नहीं है।

आप तार आप पर विशेषज्ञ की जरूरत के एक बहुत छोटे से सेट है, तो आप कीवर्ड का उपयोग करने पर विचार हो सकता:

(defmethod operation ((arg (eql ':tag-1))) ...) 
(defmethod operation ((arg (eql ':tag-2))) ...) 

जो आप

(operation (intern ... :keyword)) 
+1

कीवर्ड उद्धृत करने की कोई आवश्यकता नहीं है, वे स्वयं मूल्यांकन करते हैं। – Vatine

+0

@ वैटिन: यह एक आदत है। मैं अक्सर उपयोग के आधार पर 'शून्य' (या '()') उद्धृत करता हूं (उदाहरण के लिए, '' deflass' या 'defstruct' के initform' में)। क्या मुझे पेशेवर मदद चाहिए? :-) – Dirk