2013-12-20 220 views
1

如何加載目錄中的每個clojure文件?從clojure目錄加載所有文件

下面的代碼不工作,但本身說話(「文件夾」在我的src /項目目錄)

(load "folder/*") 
+0

爲什麼要這麼做?你是否期望在命名空間和依賴關係中沒有衝突? – Chiron

+0

我有一些名字空間變得太大了一個文件,所以我已經把它分成幾個文件,我加載到我的主要ns文件加載函數,我可以很方便地能夠導入所有這些在一個函數中 – szymanowski

回答

5

下面的函數,你在找什麼,給你描述它的場景似乎沒有必要檢查依賴關係,因此該函數不會執行任何操作,只能將load-file與所提供的路徑中的所有文件一起使用。

(defn load-files [path] 
    (let [file (java.io.File. path) 
     files (.listFiles file)] 
    (doseq [x files] 
    (when (.isFile x) 
     (load-file (.getCanonicalPath x)))))) 

(load-files ".") 

listFiles的文檔說,有順序沒有保證的文件返回,所以可能的改進是提供一個鍵功能(即返回其上的排序是做導航鍵的功能)做排序。

(defn load-files [path f] 
    (let [file (java.io.File. path) 
     files (sort-by f (.listFiles file))] 
    (doseq [x files] 
    (when (.isFile x) 
     (load-file (.getCanonicalPath x)))))) 

(load-files "." #(.getName %)) 

如果你想要加載在目錄樹中的所有文件,那麼你可以使用file-seq通過@edbond的建議。

(defn load-files [path f] 
    (let [files (->> path java.io.File. file-seq (sort-by f))] 
    (doseq [x files] 
    (when (.isFile x) 
     (load-file (.getCanonicalPath x)))))) 

(load-files "." #(.getName %)) 
+0

file-seq可以在這裏使用 – edbond

+1

@edbond'file-seq'可以被使用,但是它也會在'path'的子目錄中列出文件,但是也可能這就是OP想要的。我將用'file-seq'添加第三個實現。 –

+0

這不適用於REPL以外的clojurescript。這似乎不是一個clojurescript問題,標籤有誤導性。僅供參考編輯標籤的人員。 – user3810626