2008-09-01 11 views
7

मुझे लगता है कि मैं हर समय इस तरह की चीज कर रहा हूं। मैं इस तरह की चीज को आसान बनाने के लिए एक मैक्रो/फ़ंक्शन लिखने पर विचार कर रहा हूं, लेकिन यह मेरे लिए होता है कि मैं शायद पहिया को फिर से शुरू कर रहा हूं।सामान्य लिस्पी मुहावरे - क्या कोई बेहतर तरीका है?

क्या कोई मौजूदा कार्य है जो मुझे इस तरह की चीज को और अधिक संक्षेप में पूरा करने देगा?

(defun remove-low-words (word-list) 
    "Return a list with words of insufficient score removed." 
    (let ((result nil)) 
    (dolist (word word-list) 
     (when (good-enough-score-p word) (push word result)))          
    result)) 

उत्तर

23

ऐसा करने के कई अंतर्निहित तरीके हैं। एक तरीका यह होगा:

(remove-if-not 'good-enough-score-p word-list) 

और एक और:

(loop for word in word-list 
     when (good-enough-score-p word) 
     collect word) 

और फिर भी एक और:

(mapcan (lambda (word) 
      (when (good-enough-score-p word) 
      (list word))) 
     word-list) 

आदि ... वहाँ भी SERIES और Iterate है। दोहराएं संस्करण लूप संस्करण के लिए समान है, लेकिन श्रृंखला संस्करण दिलचस्प है:

(collect (choose-if 'good-enough-score-p (scan word-list)))) 

तो, हाँ, तुम बहुत कुछ पहिया बदलने की संभावना हो। :-)

+0

धन्यवाद - मैंने वास्तव में पहले मैककन का उपयोग करने के कारण के साथ कभी नहीं आया है, लेकिन यह मुझे रास्ता दिखाता है। इस विशेष उदाहरण के लिए, निकालें- अगर/निकालें-अगर-बेहतर नहीं है, लेकिन फिर भी, बहुत अच्छा है। – khedron

-2

कुछ तरीके हैं जो आप कर सकते हैं। सबसे पहले, और शायद सबसे आसानी से, आप इसे फिर से कर सकते हैं।

(defun remove-low-words (word-list) 
    (if (good-enough-score-p (car word-list)) 
     (list word (remove-low-words (cdr word-list))) 
     (remove-low-words (cdr word-list)))) 

तुम भी mapcar और reduce, जहां पूर्व आप nil द्वारा प्रतिस्थापित नाकाम रहने के तत्वों और बाद को फ़िल्टर करने के nil इस्तेमाल किया जा सकता के साथ एक सूची का निर्माण कर सकते हैं के साथ यह कर सकता है।

या तो "फ़िल्टर" मैक्रो या फ़ंक्शन के लिए एक अच्छा उम्मीदवार होगा जो एक सूची लेता है और कुछ भविष्यवाणी द्वारा फ़िल्टर की गई सूची लौटाता है।

+0

मेरा मानना ​​है कि अपने संस्करण कोई आधार के मामले में, अन्य समस्याओं के साथ है। –

6

जो फ़ंक्शन आप चाहते हैं वह remove-if-not है, जो अंतर्निहित है।

(defun remove-low-words (word-list) 
    (remove-if-not #'good-enough-score-p word-list)) 

आप की तरह आप कर रहे हैं सूची के साथ कुछ करने के लिए फिर से खोज करने लग रहा है, तो आप शायद कर रहे हैं। देखने के लिए Hyperspec की जांच करें।