2013-02-12 16 views
7

मान लीजिए कि मैं Clojure में निम्नलिखित निर्देशिका संरचना बनाने की जरूरत है:Clojure निर्देशिका पदानुक्रम बना सकते हैं - लेकिन एक प्रक्रियात्मक तरीके से नहीं

a 
\--b 
| \--b1 
| \--b2 
\--c 
    \-c1 

के बजाय निम्नलिखित की तरह प्रक्रियात्मक काम करने:

(def a (File. "a")) 
(.mkdir a) 
(def b (File. a "b")) 
(.mkdir b) 
;; ... 

... क्या उपरोक्त कार्यों को डेटा के रूप में किसी भी तरह से प्रस्तुत करने का एक चालाक तरीका है, घोषणात्मक रूप से, और उसके बाद पदानुक्रम बनाने में एक झुकाव गिर गया है?

+0

'मेक-माता-पिता' सहायक हो सकता है https://clojuredocs.org/clojure.java.io/make-parents – xhh

उत्तर

8

एक तेज़ और सरल दृष्टिकोण पर यह करने के dirs का एक वेक्टर बनाने के लिए और नक्शे mkdir बनाने के लिए होगा:

user> (map #(.mkdir (java.io.File. %)) ["a", "a/b" "a/b/c"]) 
(true true true) 

या आप एक पेड़ के रूप में अपने dir संरचना निर्दिष्ट और ज़िपर का उपयोग बना चलने के लिए कर सकते हैं रास्ते पर डीआईआर:

(def dirs ["a" ["b" ["b1" "b2"]] ["c" ["c1"]]]) 
(defn make-dir-tree [original] 
    (loop [loc (zip/vector-zip original)] 
    (if (zip/end? loc) 
     (zip/root loc) 
     (recur (zip/next 
       (do (if (not (vector? (zip/node loc))) 
        (let [path (apply str (interpose "/" (butlast (map first (zip/path loc))))) 
          name (zip/node loc)] 
         (if (empty? path) 
         (.mkdir (java.io.File. name)) 
         (.mkdir (java.io.File. (str path "/" name)))))) 
        loc)))))) 
(make-dir-tree dirs) 

[email protected]:~/hello$ find a 
a 
a/c 
a/c/c1 
a/b 
a/b/c 
a/b/b2 
a/b/b1 

यदि आप बहुत सारे सामान्य सिस्टम प्रशासन कर रहे हैं तो कुछ भारी हो सकता है। pallet project भौतिक और क्लाउड होस्टेड सिस्टम पर सभी प्रकार के सिस्टम प्रशासन करने के लिए एक लाइब्रेरी है (हालांकि यह बादलों की चीजों की तरफ झुकता है)। विशेष रूप से

+2

मैं 'नक्शा' आलसी होने से उत्पन्न होने वाली संभावित समस्याओं का उल्लेख करने की अनुशंसा करता हूं। – ponzao

+2

करेगा !, आलसी-बग –

+2

के लिए हमेशा देखें, आलसी-बग से बचने के लिए आप 'मानचित्र' के बजाय 'doseq' का उपयोग कर सकते हैं, क्योंकि आप प्रत्येक 'mkdir' के परिणाम की परवाह नहीं करते हैं। – bfontaine