2009-07-30 11 views
5

मैं अपनी सूची में परीक्षणों की एक श्रृंखला लागू करना चाहता हूं और यह सुनिश्चित करना चाहता हूं कि सभी परीक्षण पास हो जाएं। क्या क्लोजर में "एंडमैप" जैसा कोई फ़ंक्शन है?क्या क्लोजर में "एंडमैप" जैसा कोई फ़ंक्शन है?

+1

क्या आप एक इंपल इनपुट और आउटपुट जोड़ सकते हैं? –

उत्तर

9

आप every? इस्तेमाल कर सकते हैं:

user=> (every? string? '("hi" 1)) 
false 

यहाँ every? पर दस्तावेज़ीकरण है।

1

every? पूछेगा "क्या यह एक समारोह सीक के प्रत्येक सदस्य के लिए सच है", जो मुझे लगता है कि आप जो चाहते हैं उसके करीब है। every? पर एक सुधार कार्य की एक सूची लेगा और पूछेगा "क्या ये सभी भविष्यवाणी इस सीईसी के प्रत्येक सदस्य के लिए सच हैं"।

यहाँ एक पहला प्रयास है:

(defn andmap? [data tests] 
    (every? true? (for [d data, f tests] 
        (f d)))) 

user> (andmap? '(2 4 8) [even? pos?]) 
true 
user> (andmap? '(2 4 8) [even? odd?]) 
false 
1

मैं एक मैक्रो जो अपने तर्कों के रूप में लेता है और विधेय एक समारोह "लपेटता विधेय के चारों ओर एक and" है कि बनाता है, यानी के रूप में andmap लिखा था,

(andmap integer? odd?) 
==> 
(fn [x] (and (integer? x) 
      (odd? x))) 

(यह पर विस्तारित नहीं है यह, लेकिन यह इसके बराबर कुछ है)

यह लाभ है कि यह विधेय पर shortcuircuts ताकि आप एक क्रम अपवाद हो रही के रूप में आप Arthurs answer साथ मिलेगा बिना

(every? (andmap integer? odd?) [1 3 "a string"]) 

लिख सकते है।

यहाँ andmap की परिभाषा है:

 
(defmacro andmap 
    ([]  `(fn [& x#] true)) 
    ([p & ps] `(fn [& x#] (and (apply ~p x#) 
          (apply (andmap [email protected]) x#))))) 

यह भी एक समारोह के रूप में andmap परिभाषित करना संभव है जो भी lazyness की वजह से यह विधेय पर शॉर्ट सर्किट:

 
(defn andmap [& ps] 
    (fn [& x] 
    (every? true? (map (fn [p] (apply p x)) ps)))) 

विधेय को एंडमैप तर्कों की मनमाना संख्या ले सकता है, इसलिए

(map (andmap #(and (integer? %1) 
        (integer? %2)) 
      #(and (odd? %1) 
        (even? %2)) 
      <) 
    [1 3 9] 
    [2 6 "string"]) 
लिखना संभव है

जो (true true false) का मूल्यांकन करता है।

2

क्लोजर 1.3 प्रत्येक-पूर्व (और "या" संस्करण के लिए संबंधित कुछ-एफएन) जोड़ देगा।

clojure.core/हर-pred ([पी] [p1 p2] [p1 p2 p3] [p1 p2 p3 & ps])

विधेय का एक सेट ले जाता है और रिटर्न एक समारोह च यह सच रिटर्न यदि इसकी सभी भविष्यवाणी लिखने से इसके सभी तर्कों के खिलाफ एक तार्किक सत्य मान लौटाता है, तो यह झूठा देता है। ध्यान दें कि एफ शॉर्ट-सर्किटिंग है जिसमें यह पहले तर्क पर निष्पादन को रोक देगा जो मूल भविष्यवाणियों के खिलाफ तार्किक झूठे परिणाम को ट्रिगर करता है।

एक अनुभवहीन कार्यान्वयन हो सकता है:

(defn हर-pred [& preds] (एफ एन [& args] (प्रत्येक # (हर% args) preds))?)

लेकिन वास्तविक कार्यान्वयन बेहतर प्रदर्शन होगा।

संबंधित मुद्दे