我对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)))
答案 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语言编译单元更具结构化的概念,可以直接在代码中以粒度方式与之交互。一开始看起来很奇怪,但它允许对代码的各个部分中可见的定义进行细粒度控制(这反过来又有助于使代码更易于维护和理解)。