Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用clojure动态包含文件夹中的所有源文件?_Clojure - Fatal编程技术网

如何使用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))