2011-11-14 14 views
5

विफल हो जाती है तो क्षमा करें, क्षमा करें यदि यह प्रश्न कोई समझ नहीं लेता है।कार्यक्रम प्रवाह - यदि कोई गणना

मैं वर्तमान में एक छोटा सा एप्लीकेशन लिखने के बीच में हूं और मैं एक साथ कुछ कार्यों को 'चेन' करना चाहता हूं जो व्यापक गणना करता है।

तो उदाहरण के लिए, मेरे पास एक ऐसा कार्य है जो एक webservice कहता है और परिणामस्वरूप hash-map देता है, या nil यदि कोई त्रुटि हुई या कुछ गलत हो गया। श्रृंखला में अगला कार्य नक्शा लेता है और कुछ और प्रसंस्करण करता है और फिर इसे अगले कार्य में भेजता है ... और इसी तरह।

बात यह है कि यदि पहला फ़ंक्शन विफल रहता है, तो यह अगले कार्य में nil पास करने जा रहा है और यह एक नलपॉइंटर (या जो कुछ भी) फेंक देगा और मैं नहीं चाहता कि यह इस चरण तक पहुंच जाए। तो दूसरे शब्दों में मैं चाहता हूं कि श्रृंखला में एक आइटम विफल होने पर पूरी गणना विफल हो जाए।

उदा।

;successful computation = function1 returns W -> function2 returns X -> function3 returns Y -> function4 returns Z -> Z 
;failed computation = function1 returns W -> function2 returns X -> function3 returns nil -> nil 
(-> (function1 "http://webservice.com") (function2) (function3) (function4)) 

बात है मैं नहीं है शुरू में if(nil? arg) के साथ अपने कार्यों में से प्रत्येक कचरा होने के लिए, आदर्श मैं एक अमूर्त है कि मेरे लिए इस बात का ध्यान रखना सकता है करना चाहते हैं चाहते हैं, लेकिन मैं वास्तव में कुछ भी नहीं पता कर रहा हूँ क्या Clojure

मैं स्काला शैली Option प्रकार है कि या तो हो सकता है Some(value) या None लेकिन मैं अभी भी कूड़े के लिए इन चेकों के साथ अपने कोड शुरू में आवश्यकता होगी अपनाने का सोच रहा था

कोई भी विचार या में उपलब्ध है पर उत्तरों की वास्तव में सराहना की जाएगी

उत्तर

4

Clojure Contrib के algo.monad में मोनैड का कार्यान्वयन शामिल है जो स्कैला Option पर कॉल करता है। इसे maybe-m कहा जाता है और nilNone के रूप में इलाज करके काम करता है। आप इसे इस तरह का उपयोग कर सकते हैं:

(ns mulk.monads-test 
    (:refer-clojure) 
    (:use clojure.repl 
     clojure.algo.monads)) 

(defn function1 [x] 
    x) 

(defn function2 [x] 
    (+ x 10)) 

(defn function3 [x] 
    (* x 2)) 

(defn calc-stuff [thing] 
    (domonad maybe-m 
    [x1 (function1 thing) 
    x2 (function2 x1) 
    x3 (function3 (+ x2 10))] 
    x3)) 

(calc-stuff 10) ;=> 60 
(calc-stuff nil) ;=> nil 
+0

बहुत बढ़िया इस:

(defn chain [v & functions] (cond (nil? v) nil (empty? functions) v :else (recur ((first functions) v) (rest functions)))) 

तो इस तरह इसे कहते जो मैं खोज रहा था, ऐसा लगता है कि उस पुस्तकालय में कुछ और अवशोषण हैं जो मेरे लिए भी बहुत उपयोगी साबित होंगे! – djhworld

4

clojure.contrib.core -?> मैक्रो करता है कि आप क्या चाहते हैं।

देखें http://clojuredocs.org/clojure_contrib/clojure.contrib.core/-_q%3E

+0

आह! उत्तम सामग्री। मुझे आश्चर्य है कि '-?>' मैक्रो वास्तव में मैथियस के जवाब में वर्णित 'हो सकता है' मोनड के लिए सिर्फ एक रैपर है? – djhworld

+0

नहीं, कार्यान्वयन स्वयं निहित है: https://github.com/clojure/clojure-contrib/blob/master/modules/core/src/main/clojure/clojure/contrib/core.clj –

1

आप फ़ंक्शन कॉल चेनिंग और बीच में नहीं के बराबर मूल्यों के लिए जाँच के लिए एक सहायक समारोह निर्धारित कर सकते हैं:

(chain "http://webservice.com" function1 function2 function3 function4) 
संबंधित मुद्दे