2011-10-27 18 views
14

मैं एक मूल्य के लिए दो (या अधिक) भविष्यवाणी करना चाहता हूं। उदाहरण के लिए, कहते हैं कि मैं अगर एक मूल्य एक सकारात्मक पूर्णांक है परीक्षण करना चाहते हैं:क्लोजर में आप दो या दो से अधिक भविष्यवाणियों को कैसे लिखते हैं?

(defn posint? [n] 
    (and (integer? n) (pos? n))) 

यह होता है, लेकिन क्या अगर मैं लागू किया विधेय रचना करना चाहते हैं यही कारण है कि? मैं भविष्यवाणियों के प्रत्येक संभावित संयोजन के लिए एक समारोह लिखना नहीं चाहता हूं।

उत्तर

20

Clojure 1.3 में वहाँ है वास्तव में एक में निर्मित समारोह every-pred कहा जाता है सिर्फ यह करने के लिए। here देखें।

(defn posint? [n] 
    ((every-pred integer? pos?) n)) 
+0

यह भी '(पॉजिंट? "एक")' संभालता है! दुर्भाग्य से हालांकि मुझे 1.2 समाधान की आवश्यकता है। – stand

+2

@stand: मुझे लगता है कि आप इस कार्य को क्लोजर स्रोतों से ले सकते हैं और अपना कोड डाल सकते हैं –

2

यदि आप इन चेक इनलाइन को देखना चाहते हैं, तो निम्न हो सकता है कि आप जो खोज रहे हैं।

(defn predicate-test [fns t] 
    "test all predicates against value t and return true iff all predicates return true." 
    (every? true? ((apply juxt fns) t))) 

(predicate-test [integer? pos?] 4) 

तब आप अपने सबसे अधिक इस्तेमाल किया विधेय परीक्षण के लिए नामित किया गया संस्करण बना सकते हैं:

(def posint? (partial predicate-test [integer? pos?]) 

(posint? 4) 
+0

आह हाँ, यह 'juxt' फ़ंक्शन था जिसे मैं याद कर रहा था। धन्यवाद! – stand

+0

... यद्यपि यह समाधान एक अपवाद फेंकता है जब आप 'pos (? Pos"? '' '' के रूप में 'pos' के रूप में 'CastException' फेंकता है'। मैं शॉर्ट सर्किट के रास्ते और 'तरीके' के तरीके के बारे में नहीं सोच सकता। – stand

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