2010-08-03 9 views
9

मान लीजिए कि मेरे पास एक तत्व है, और मेरे पास भविष्यवाणियों (कार्यों) की एक सूची है। मैं इन भविष्यवाणियों में से प्रत्येक को एक तत्व में लागू करना चाहता हूं और वापसी मानों की एक समान सूची प्राप्त करना चाहता हूं। मुझे पता है कि map और दोस्तों तर्कों की एक सूची में एक ही फ़ंक्शन लागू कर सकते हैं, लेकिन क्या एक ही तर्क में कई फ़ंक्शंस लागू करने के लिए कोई संक्षिप्त वाक्यविन्यास है?सभी को समान तर्कों के कार्यों की एक सूची लागू करने के लिए लिस्पी कोड संक्षिप्त करें और वापसी मूल्यों की एक सूची प्राप्त करें?

बेशक

मैं

(mapcar (lambda (pred) (funcall pred SINGLE-ELEMENT)) LIST-OF-PREDICATES) 

कर सकते हैं, लेकिन यह अच्छा होगा अगर वहाँ एक समारोह है कि तरह काम किया था:

(test-predicates-against-element LIST-OF-PREDICATES SINGLE-ELEMENT) 

जाहिर है मैं कर सकते हैं बस इसे defun, लेकिन मैं अगर जानना चाहता था ऐसा करने के लिए एक स्वीकार्य विधि है।

उत्तर

9

यह ऑपरेशन सामान्य नहीं है और इसे सामान्य लिस्प में सीधे लिखने के अलावा इसे करने के लिए वास्तव में एक पूर्वनिर्धारित तरीका नहीं है। छोटे सिंटैक्स और अतिरिक्त वाक्यविन्यास तत्व जैसे विभिन्न लोग जो इस तरह के मामले में सभी प्रकार के लिस्पस में मदद करेंगे। सामान्य लिस्प में कोई ऐसा फ़ंक्शन लिखना चाहता है जो आप चाहते हैं (सिंटैक्स जोड़ने के बजाय)।

(defun fmap (functions &rest args) 
    (declare (dynamic-extent args)) 
    "Applies each function to the arguments. Returns a list of results." 
    (mapcar (lambda (function) 
      (apply function args)) 
      functions)) 

CL-USER 1 > (fmap (list #'+ #'- #'* #'/) 42 17) 
(59 25 714 42/17) 
+0

मुझे समझ में नहीं आता कि सीएलएचएस को क्या कहना है कि डायनामिक-एक्सटेन्ट क्या करता है। प्रविष्टि का कहना है कि, एक उदाहरण के रूप में, एक कार्यान्वयन इस प्रकार घोषित आवंटित चर आवंटित करने का चयन कर सकता है, और यह दिखाता है कि यह संभवतया एक defun के पैरामीटर आवंटित करने के लिए उपयोगी नहीं है। यह यहां काम करता है क्योंकि तर्क एक सूची है (ज्ञात आकार के)? –

+1

तर्क एक सूची है। यह सूची केवल इस फ़ंक्शन के अंदर उपयोग की जाती है और वापस नहीं आती है। इस प्रकार गतिशील सीमा। यदि समर्थित है तो सूची को आवंटित किया जा सकता है। इस समारोह से लौटने पर सूची नष्ट हो जाएगी, इस प्रकार कोई जीसी समय की आवश्यकता नहीं है। –