Clojure加载文件

So8*_*res 10 clojure

我正在尝试建立一个简单的clojure项目,我不确定如何在项目之间加载文件.我确定答案在文档中,但我找不到任何地方的简单答案,我不知道在哪里看.

基本上,我的目录看起来像这样:

Clojure/
    clojure/
        clojure.jar
        other clojure files
    clojure-contrib/
        clojure-contrib.jar
        other contrib files
    project/
        main.clj
        utils.clj
Run Code Online (Sandbox Code Playgroud)

我希望main.clj是这样的:

(ns project.main
  (:require project.utils))
(greet)
Run Code Online (Sandbox Code Playgroud)

和utils.clj是这样的:

(ns project.utils)
(defn greet [] (println "Hello, World!"))
Run Code Online (Sandbox Code Playgroud)

但那失败了:

Exception in thread "main" java.io.FileNotFoundException: Could not locate project/utils__init.class or project/utils.clj on classpath:  (main.clj:1)
Run Code Online (Sandbox Code Playgroud)

当我试图运行它.我的类路径包括顶层Clojure/目录和两个jar.我也尝试将project/目录放在类路径中,没有运气.

你如何建立一个简单的clojure项目?

Ale*_*x B 9

你没有提到你的环境(即Emacs/SLIME/Swank,vim/Vimclojure),所以我假设你试图从命令行调用它.

您需要Clojure/在类路径中包含项目目录:

java -cp path/to/clojure.jar:path/to/clojure-contrib.jar:path/to/Clojure ...
Run Code Online (Sandbox Code Playgroud)

确保检查相对于当前工作目录的路径是否正确.它需要指向命名空间的根(即如果运行Clojure/,则路径为.).

实际上,你的项目布局是在我的机器上工作(tm),除了我有use而不是require(但如果你到达Clojure可以找到所有文件的时候你应该得到一个不同的错误).


Mic*_*zyk 5

我在另一个问题上发布的这个答案应该可以让您了解文件名应该如何与命名空间名称相关联.但是,由于你的问题是"如何设置一个简单的Clojure项目",以下是一个更好的开始:

  1. 去GitHub并抓住Leiningen.

  2. 按照自述文件中的说明进行操作.你最终会做类似的事情

    $ lein new my-project
    $ cd my-project
    # ... edit project.clj ...
    $ lein deps
    
    Run Code Online (Sandbox Code Playgroud)
  3. 劈开!您需要将文件放在正确的位置.这将意味着将您的源文件放在my-project/src以您的核心命名空间为根的目录树 中my-project/src/my_project/core.clj.但实际上,我已经解释了与上述相关的答案所有细节,所以请阅读(如果我错过了某些内容,请留言).:-)

Leiningen将负责基本的项目布局并为您设置REPL/swank/nailgun的类路径(如果您还没有遇到后两者,您很快就会 - 但这是一个单独的主题,swank部分其中我已经涵盖了一定程度,例如在这个SO答案中),所以希望你永远不需要java -cp ...手工处理废话.(我在上一个括号内注释中与swank相关的答案详细说明了如何使用Emacs中的正确类路径设置swank.)