如何使用clojure动态包含文件夹中的所有源文件?
我定义了一个功能图:如何使用clojure动态包含文件夹中的所有源文件?,clojure,Clojure,我定义了一个功能图: (ns fs (:require [folder/a :as a] [folder/b :as b] [folder/c :as c]) (def functions {:a a/f :b b/f :c c/f}) (doseq [[_ f] functions] (f)) 现在我想在文件夹中添加更多的名称空间,我不想修改上面的代码。如何使用文件夹中每个命名空间中的f动态填充函数。首先是一些帮助程序: (defn
(ns fs
(:require [folder/a :as a]
[folder/b :as b]
[folder/c :as c])
(def functions {:a a/f :b b/f :c c/f})
(doseq [[_ f] functions] (f))
现在我想在文件夹中添加更多的名称空间,我不想修改上面的代码。如何使用文件夹中每个命名空间中的f
动态填充函数。首先是一些帮助程序:
(defn directory
"Get directory from path"
[path]
(clojure.java.io/file path))
(defn file-names
"Get file names of the files in the directory."
[files]
(map (fn [file] (.getName file)) files))
(defn namespace
"Remove the extension from the file name and prefix with folder-name"
[folder-name file-name]
(->> (clojure.string/split file-name #"\.")
(butlast)
(apply str)
(str folder-name ".")
(symbol)))
然后从文件夹中检索所有名称空间,您需要路径和文件夹名称:
(def namespaces
(let [names (->> "/path/to/your/folder-name"
directory
file-seq ;; Gets the tree structure of the directory
rest ;; Get rid of the the directory name
file-names)]
(map (partial namespace "folder-name") names)))
接下来,通过以下方式获取每个命名空间中的公共函数:
注意,这将在名称空间键之后获得名称空间中所有公共函数的列表
我们可以执行以下功能:
(doseq [[_ ns-fns] functions
f ns-fns] (f))
当然,这只适用于算术数为零的函数。否则,您必须将参数传递给f
,这个问题措词不当,令人困惑。如果你想要一个答案,你应该澄清:(1)你想要什么,(2)你尝试了什么,(3)结果是什么。你的问题对我来说有点不清楚,但我觉得你可以检查和回答
(doseq [[_ ns-fns] functions
f ns-fns] (f))