2010-06-10 6 views
5

मुझे आश्चर्य है कि क्या कोई तरीका है कि मैं getf को eq के बराबर उपयोग करके तुलना करने के लिए मजबूर कर सकता हूं? मैं आम लिस्प के सीसीएल कार्यान्वयन का उपयोग कर रहा हूँ।ईक के बजाय तुलना के लिए getf उपयोग बराबर कर सकते हैं? (सामान्य lisp)

+1

सबसे अच्छा समाधान तथापि में, वहाँ एक "बग" है: यह "कुंजी मान" की जोड़ी के रूप में सूची का इलाज नहीं होता है, तो यह है कि (बराबर-getf '(एबीसीडी)' ख) सी रिटर्न जबकि (getf '(एबीसीडी)' बी) शून्य लौटाता है। बस इस समाधान के बारे में जागरूक रहें – ShinTakezou

उत्तर

4

नहीं। आपको एक अलग फ़ंक्शन का उपयोग करना होगा;

यहाँ एक निश्चित संस्करण है कि सूची को ठीक से व्यवहार करता है कुंजी/मान जोड़े के रूप में है

(defun equal-getf (plist indicator) 
    (second (member indicator plist :test #'equal))) 

संपादित करें:: लगभग कुछ इस तरह है कि तुम क्या जरूरत हो सकती

(defun equal-getf (plist indicator) 
    (loop for key in plist by #'cddr 
     for value in (rest plist) by #'cddr 
     when (equal key indicator) 
     return value)) 
0

मुझे नहीं पता पता करें कि डिफ़ॉल्ट रूप से "ओवरराइड" करने का कोई तरीका है, तो देखें कि क्या आप (describe 'getf) या (symbol-plist 'getf) का उपयोग करके एक इम्प्ला पा सकते हैं। एक संभावित semplified कार्यान्वयन हो सकता है

(defun mgetf (l v) 
    (if (< (length l) 2) 
     NIL 
    (if (equal (car l) v) 
     (car (cdr l)) 
    (mgetf (nthcdr 2 l) v))))

संपादित: डबल सीडीआर के बजाय nthcdr का उपयोग करें।

+0

अन्य समाधान की तुलना में बहुत बेवकूफ प्रत्यारोपण ... lisp के साथ थोड़ा सा जंगली (जो वर्तमान में मैं केवल emacs के लिए उपयोग करता हूं ..., जब आवश्यक हो) ... – ShinTakezou

0

यह नौकरी करना चाहिए। यह अच्छी तरह से रिकर्सिव नहीं है, लेकिन सीधे-आगे लूप एप्लिकेशन का उपयोग करता है। इसे टीआई को मनमाने ढंग से समकक्षता का उपयोग करने की अनुमति देने के लिए, वैकल्पिक तर्क का उपयोग करने का मार्ग सीधे-आगे होना चाहिए।

(defun mgetf (place indicator) 
    (loop for (key value . rest) on place by #'cddr 
    if (equal key indicator) 
    do (return value)))