Clojure创建目录层次结构-但不是以过程方式

Clojure创建目录层次结构-但不是以过程方式,clojure,Clojure,假设我需要在Clojure中创建以下目录结构: a \--b | \--b1 | \--b2 \--c \-c1 而不是执行以下程序性操作: (def a (File. "a")) (.mkdir a) (def b (File. a "b")) (.mkdir b) ;; ... 。。。是否有一种聪明的方法可以以某种方式将上述操作表示为数据,以声明的方式,然后一次性创建层次结构?一种快速而简单的方法是创建一个dir向量,并将mkdir映射到该向量: user> (map

假设我需要在Clojure中创建以下目录结构:

a
\--b
|   \--b1
|   \--b2
\--c
   \-c1
而不是执行以下程序性操作:

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

。。。是否有一种聪明的方法可以以某种方式将上述操作表示为数据,以声明的方式,然后一次性创建层次结构?

一种快速而简单的方法是创建一个dir向量,并将mkdir映射到该向量:

user> (map #(.mkdir (java.io.File. %)) ["a", "a/b" "a/b/c"])
(true true true)
或者,您可以将dir结构指定为一棵树,并使用拉链在途中移动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)


如果你正在做大量的一般系统管理工作,那么可能需要做一些更重的工作。是一个库,用于在物理和云托管系统上进行各种系统管理(尽管它倾向于使用云计算)。具体来说,

我建议提及由于
map
懒惰而可能产生的问题。我会的!,始终注意懒惰的错误您可以使用
doseq
而不是
map
来避免懒惰的错误,因为您不关心每个
mkdir
的结果
让父母
可能会有帮助
arthur@a:~/hello$ find a
a
a/c
a/c/c1
a/b
a/b/c
a/b/b2
a/b/b1