2011-02-09 10 views
24

में शाखाकरण मैं खुद को क्लोजर पढ़ रहा हूं।यदि अन्यथा क्लोजर

गैर-एफपी भाषा में, अगर मैं विशेष रूप से किसी और को नहीं डालता, तो मैं आसानी से नेस्टेड लिख सकता था, और अगर नियंत्रण ब्लॉक से बाहर हो जाता है। उदाहरण के लिए:

Thing myfunc() 
{ 
    if(cond1) 
    { 
    if(cond2) 
     return something; 
    } 
    return somethingelse; 
} 

हालांकि, Clojure में, वहाँ कोई वापसी कथन है (है कि मैं के बारे में पता), इसलिए यदि मैं लिखने:

(defn myfunc [] 
    (if (cond1) 
     (if (cond2) something)) 
    somethingelse) 

फिर वहाँ है "कुछ" पर कोई "वापसी"। ऐसा लगता है कि ठीक है, ठीक है, यहां हमारे पास एक मूल्य है, अब चलो निष्पादन जारी रखें। स्पष्ट समाधान की स्थिति, यानी .: गठबंधन करने के लिए

(if (and (cond1) (cond2)) 
    something 
    somethingelse) 

होगा, लेकिन इस बोझल/बदसूरत हो जाता है बड़े स्थितियों के लिए। साथ ही, यह cond1 के "अन्य" भाग में एक बयान जोड़ने के लिए अतिरिक्त समाशोधन लेगा। क्या इसका कोई शानदार समाधान है?

+0

मैं नहीं दिख रहा है कि यह कैसे मिलेगा "बोझल"। क्या आप कुछ उदाहरण पेश कर सकते हैं? – Svante

+0

समस्या जिस पर मैं काम कर रहा था, यह जांच कर रहा था कि दो नंबर दोनों 3 अंक थे। यह लिखने के लिए मुझे बहुत बदसूरत लग रहा था (अगर (और (= 3 (गिनती (str num1)) (= 3 (गिनती (str num2)))) कुछ) – Kricket

+1

लगता है जैसे आपको एक फ़ंक्शन चाहिए! '(तीन def? [num] (= 3 (गिनती (str num))) 'फिर आपको केवल इतना चाहिए' (अगर (और (तीन? num1) (तीन? num2)) कुछ)' – Jeremy

उत्तर

30

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

Thing myfunc() { 
    if(cond1 && cond2) { 
     return something; 
    } else { 
    return somethingelse; 
    } 
} 

Clojure में, उसके बराबर है:

Thing myfunc() { 
    if(cond1) { 
    if(cond2) 
     return something; 
    } 

    return somethingelse; 
} 

आप के लिए यह refactor कर सकते हैं:

इस समारोह स्पष्ट करने के

(defn myfunc [] 
    (if (and cond1 cond2) 
     something 
     somethingelse)) 

आप एक "किसी और की जरूरत है ", आपका जावा संस्करण बन सकता है:

Thing myfunc() { 
    if(cond1) { 
    if(cond2) { 
     return something; 
    } else { 
     return newelse; 
    } 
    } else { 
    return somethingelse; 
    } 
} 

... और उसके Clojure बराबर:

(defn myfunc [] 
    (if cond1 
     (if cond2 something newelse) 
     somethingelse)) 
+2

आपको अंतिम उदाहरण में उपयोग करना होगा यदि – nickik

+0

नहीं, तो आप नहीं करते हैं। सभी मान एकल एस-एक्सप्रेशन हैं .. –

+0

"जब" हमेशा मेरी राय में प्रोग्रामिंग में "अगर" से अधिक समझ में आता है। लेकिन निश्चित रूप से, यह सिर्फ शैली का मामला है। 'Condp' के लिए – sova

15
(if (and (cond1) (cond2)) 
    something 
    somethingelse) 

(cond 
    (and (cond1) (cond2)) something 
    :else somethingelse) 

cond अगर आप एक ही बात की तुलना करना चाहते ऐसा करने के करता है, स्विच-केस में आप condp का उपयोग कर सकते हैं।

मुझे उस तरह का कोड बहुत बार नहीं दिखता है, लेकिन ऐसा करने का यही तरीका है।

+1

+ 1। – charleslparker

7

वहाँ Clojure में कोई स्पष्ट वापसी कथन है, लेकिन अपने कोड क्योंकि आप उस if के बाद और Clojure में पिछले अभिव्यक्ति की परिणाम किसी भी भाव नहीं है "कुछ" पर "लौटने" होगा समारोह के रूप में प्रयोग किया जाता है वापसी मूल्य

14

प्रभावशाली भाषाओं में if this then do that else do that कहता है और कार्यात्मक भाषाओं में 0 -कहते हैं तो कार्यात्मक भाषाओं में है। यह एक ही विचार को देखने का एक अलग तरीका है, जो समस्याओं को व्यक्त करने के लिए एक बहुत ही अलग दृष्टिकोण को दर्शाता है। कार्यात्मक भाषाओं में सब कुछ एक मूल्य है, वास्तव में सब कुछ, भले ही आप उस मूल्य के साथ कुछ भी नहीं करते हैं।

जब मैं संक्रमण कर रहा था, तो इस सवाल के बजाय "यह फ़ंक्शन क्या करना चाहिए" के बारे में पूछने के लिए बहुत कुछ करने में मदद मिली "मुझे यह पूछने का आदी था"।

0

तुम भी (cond) मैक्रो इस्तेमाल कर सकते हैं:

(defn length-checker [a b] 
    (cond 
    (= 3 (count (str a))) (if (= 3 (count (str b))) 
        (println "both numbers are 3 digits long") 
        (println "first number is 3 digits, but the 2nd not!")) 
    :else (println "first- or both of the numbers are not 3 digits"))) 
संबंधित मुद्दे