2012-04-23 13 views
6

में प्रोटोकॉल/बहुआयामी के पर्यावरण पर निर्भर प्रेषण मुझे अपने सॉफ़्टवेयर का एक विशेष टुकड़ा आर्किटेक्चर करने में समस्या का सामना करना पड़ रहा है। आइए कहें, मेरे पास make-temp-dir (और कई अन्य) नामक एक फ़ंक्शन है जो वर्तमान ओएस के आधार पर कुछ अंधेरे जादू करता है। मैं अलग-अलग नामस्थान में प्रत्येक ओएस के लिए इन विधियों के कार्यान्वयन को सक्षम करने में सक्षम होना चाहता हूं।क्लोजर

सबसे पहले, मुझे विश्वास है कि प्रोटोकॉल (यदि संभव हो) या multimethods का समाधान है। हालांकि, मैंने कभी भी कई नामस्थानों पर फैले कार्यान्वयन के साथ इनका उपयोग करने का एक उदाहरण नहीं देखा है। और मैं यह समझने में सक्षम नहीं हूं कि यह कैसे काम करेगा।

दूसरा, अगर मैं इस के लिए प्रोटोकॉल का उपयोग, मैं तरीकों कुछ

(make-temp-dir current-os arg-1 arg-2) 

की तरह किसी तरह कॉल करने के लिए, होगा पहला तर्क हर समय भी अच्छा बेहतर नहीं लगती क्योंकि ओएस गुजर मेरे लिए। अर्थपूर्ण खातिर, मैं चाहता हूं कि make-temp-dir ओएस के आधार पर बुद्धिमान निर्णय लें। निश्चित रूप से मैं कुछ मैक्रोज़ का उपयोग कर सकता हूं और

(doto current-os 
    (make-temp-dir arg-1 arg2)) 

पर कुछ ऐसा कर सकता है लेकिन यह गलत लगता है।

यह कैसे किया जाना चाहिए? या मैं गलत तरीके से जा रहा हूँ? किसी भी मदद की सराहना की।

संपादित करें: ठीक है, @ कोटारक को एक टन धन्यवाद, मैं कुछ काम करने में कामयाब रहा। इस पर ठोकरें, https://gist.github.com/2477120। यह ठीक काम कर रहा है, मुझे लगता है कि मैं इसके साथ जाऊंगा। सबको धन्यवाद।

उत्तर

7
(ns your.utils) 

(def current-os) 

(defmulti make-temp-dir 
    (fn [& _] current-os)) 

(ns your.utils.mac) 

(defmethod make-temp-dir :mac-os-x 
    [a b] 
    (...)) 

(ns your.utils.win) 

(defmethod make-temp-dir :windows 
    [a b] 
    (...)) 

अपने स्टार्टअप कोड में आप उपयोगिता कार्यों के किसी भी उपयोग करने से पहले alter-var-root साथ current-os प्रारंभ करने की है।

(let [os (find-os)] 
    (alter-var-root #'current-os (constantly os)) 
    (require (case os 
      :mac-os-x 'your.utils.mac 
      :windows 'your.utils.win))) 

आशा है कि आप शुरू कर लेंगे।

+0

तो, कोड का दूसरा भाग 'your.utils' नेमस्पेस के अंतर्गत होना चाहिए? साथ ही, '#' 'पाठक मैक्रो क्या है - क्षमा करें, यह नहीं जानते कि इसे कैसे Google पर पहुंचाया जाए;) –

+0

'#' 'को * var quote * कहा जाता है। आप https://groups.google.com/forum/?fromgroups#!topic/clojure/jDBAJD4nWqs पर var उद्धरणों का विवरण पा सकते हैं। – user100464

+0

@ कोटारक, ठीक है, भयानक समाधान। मुझे इसे पचाने के लिए बहुत लंबा लगा लेकिन मुझे लगता है कि मैं समझ रहा हूं कि क्या हो रहा है। हालांकि मुझे अपनी पहली टिप्पणी पर कुछ इनपुट पसंद है। –

1

मैं निश्चित रूप से कुछ नहीं कह सकता, लेकिन ऐसा लगता है कि आप जावा के साथ प्रदान किए जाने वाले पहिया को फिर से शुरू कर सकते हैं। Clojure.java.io (http://clojuredocs.org/clojure_core/clojure.java.io) में मूल उपकरण से परे जो कुछ प्रदान करता है उस पर सुविधाजनक रैपर के लिए https://github.com/Raynes/fs आज़माएं।

यदि आपका प्रश्न पर्यावरण-विशिष्ट कॉन्फ़िगरेशन मानों के लिए ओएस-विशिष्ट शाखाओं से आगे बढ़ता है तो आपको https://github.com/drakerlabs/milieu उपयोगी भी मिल सकता है। मैंने ड्रैकर में हमारी मालिकाना परियोजनाओं के हिस्से के रूप में यह कोड लिखा है, और हमने हाल ही में इसे मुफ्त सॉफ्टवेयर के रूप में जारी किया है। हमने अभी तक इसे आधिकारिक तौर पर समुदाय के लिए घोषित नहीं किया है, लेकिन यह क्लोजर्स में है और उपयोग के लिए तैयार है। प्रतिक्रिया की सराहना की है! अवधारणा जिसने अपनी रचना को बढ़ावा दिया वह देव/परीक्षण/स्टेजिंग/उत्पादन इत्यादि के अर्थ में वातावरण था, लेकिन मुझे कोई कारण नहीं दिख रहा था कि इसे विभिन्न ओएस वातावरण के लिए चर कॉन्फ़िगर करने के लिए क्यों उपयोग नहीं किया जा सका।

+1

लिंक rplevy के लिए धन्यवाद। मुझे लगता है कि एफएस पैकेज मेरे लिए काम में आएगा :) –