包括Clojure文件中的多个文件

时间:2015-02-28 03:16:18

标签: clojure

我对Clojure很新。我知道有一种方法可以使用像#include for C ++这样的关键字将文件包含在其他文件中。我做了一些挖掘,发现了一些指向关键字声明的东西。也许我没有正确使用它,但它似乎并不适合我。

我正在尝试编写一个函数,例如,get_all_preds使用另一个函数前驱,写在另一个文件中。这些文件都在src目录下,每个函数都是各自文件中的唯一代码。

当我将(声明bar.clj)添加到foo.clj文件的顶部时,仍然会收到无法找到栏的错误。

(defn get_all_preds
 ([tasks job]
   (cond (empty? (predecessors tasks job)) (println "No predecessors")
   :else (get_all_preds tasks (predecessors tasks job) (empty tasks))))
 ([tasks prereqs job]
   (cond (empty? prereqs) job
   :else (get_all_preds tasks (distinct (flatten (concat (predecessors tasks (first prereqs)) (rest prereqs)))) 
 (distinct (cons (first prereqs) job))))))

(defn predecessors
[tasks-list job]
  (cond (empty? tasks-list) 0
  (= job (first (first tasks-list))) (rest (rest (first tasks-list)))
  :else (predecessors (rest tasks-list) job)))

1 个答案:

答案 0 :(得分:3)

declare用于创建var而不将其绑定到值。

加载另一个Clojure名称空间的正确函数是require。要使用require,您需要使用名称空间,并使用反映文件所包含的名称空间的语义结构的路径创建文件。与#include最接近的是load,但是这应该保留给非结构化实验,在这些实验中您可能会复制/粘贴到repl中,或者不适合使用名称空间的异常情况。

一个简单的例子:

文件src/foo/bar.clj中的

(ns foo.bar)

(defn frob [] "hello")
文件src/foo/baz.clj中的

(ns foo.baz
  (:require [foo.bar :as bar]))

(defn frob [] (str (bar/frob) (bar/frob)))

(defn -main [& args]
   (println (frob))

运行foo.baz / -main将打印“hellohello”,后跟一个新行。

Clojure命名空间是一个比C语言编译单元更具结构化的概念,可以直接在代码中以粒度方式与之交互。一开始看起来很奇怪,但它允许对代码的各个部分中可见的定义进行细粒度控制(这反过来又有助于使代码更易于维护和理解)。