आप filter
, नहीं map
उपयोग करना चाहते हैं। उन सभी #<void>
मूल्यों display
द्वारा दिया क्योंकि map
उत्पादन सूची में एक परिणाम, भी उन तत्वों हम में कोई दिलचस्पी नहीं कर रहे हैं के लिए शामिल हमेशा जाएगा इसके तुल्य हैं
(define tbl '(a b c d))
(filter (lambda (item) (eq? item 'c)) tbl)
=> '(c)
, और थोड़ा कम:।
(filter (curry eq? 'c) tbl)
=> '(c)
map
का उपयोग तब किया जाता है जब आप तत्व सूची को छोड़ दिए बिना इनपुट सूची में से प्रत्येक तत्व को कुछ करना चाहते हैं। दूसरी तरफ, इनपुट सूची में तत्वों के कुछ चुनने के लिए उपयोग किया जाता है, जो #t
को दिए गए अनुमान के लिए मूल्यांकन करते हैं, और filter
अधिकांश योजना दुभाषियों में उपलब्ध है, यदि यह उपलब्ध नहीं है तो आप SRFI-1
या उपयोग कर सकते हैं ।
का उपयोग कर '(c)
प्राप्त करने के लिए कोई तरीका नहीं है केवलmap
(यह, map
प्लस apply
या remove*
, आदि का उपयोग कर काट दिया जा सकता है लेकिन है कि विचार नहीं है यह क्या है?); एक छोटे से हैकिंग के लिए
(map (lambda (item) (if (eq? item 'c) item '%)) tbl) ; placeholder in else part
=> '(% % c %)
(map (lambda (item) (when (eq? item 'c) item)) tbl) ; when has implicit #<void>
=> '(#<void> #<void> C#<void>)
समय: अगर किसी कारण से आप उपयोग केवल map
करने के लिए है और प्लेसहोल्डर के साथ एक सूची लौट कोई आपत्ति नहीं है, यहाँ विकल्प के एक जोड़े हैं।map
प्लस apply
(@WillNess 'जवाब में समझाया गया है) का उपयोग करना, यह किसी भी RxRS दुभाषिया में काम का लाभ दिया है और सबसे पोर्टेबल समाधान है, क्योंकि यह मानक प्रक्रियाओं का उपयोग करता है:
(apply append (map (lambda (item) (if (eq? item 'c) (list item) '())) tbl))
=> '(c)
map
प्लस remove*
का उपयोग करना:
(remove* (list (void)) (map (lambda (item) (when (eq? item 'c) item)) tbl))
=> '(c)
एक बदलाव के लिए, map
के बिना एक समाधान - बजाय foldr
का उपयोग कर:
(foldr (lambda (item a) (append (if (eq? item 'c) (list item) '()) a)) '() tbl)
=> '(c)
,210 बेशक, आप हमेशा ही मानक प्रक्रियाओं का उपयोग filter
के अपने स्वयं के संस्करण लागू कर सकते हैं, यह भी सभी RxRS दुभाषिए भर में पोर्टेबल हो जाएगा:
(define (filter pred? lst)
(cond ((null? lst)
'())
((not (pred? (car lst)))
(filter pred? (cdr lst)))
(else
(cons (car lst)
(filter pred? (cdr lst))))))
(filter (lambda (item) (eq? item 'c)) tbl)
=> '(c)
वैसे: '' lambda' map' को पैरामीटर के रूप में पारित कर दिया एक _single_ पैरामीटर प्राप्त करना चाहिए, तो आप दो गुजर रहे हैं और कहा कि काम नहीं करेगा: '(आइटम 'ग) ' –
आप किस दुभाषिया का उपयोग कर रहे हैं? मेरा अनुमान रैकेट है, लेकिन कृपया इसकी पुष्टि करें –
@ ओस्कर लोपेज़, हाँ, यह रैकेट है, लेकिन मुझे उम्मीद है कि समाधान सामान्य हो सकता है –