Clojure加载文件

10

我正在尝试建立一个简单的Clojure项目,但不知道如何在项目之间加载文件。我相信答案在文档中,但我找不到简单的答案,并且不确定该去哪里寻找。

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

Clojure/
    clojure/
        clojure.jar
        other clojure files
    clojure-contrib/
        clojure-contrib.jar
        other contrib files
    project/
        main.clj
        utils.clj

我希望main.clj的内容类似于以下代码:

(ns project.main
  (:require project.utils))
(greet)

而utils.clj应该类似于以下内容:

(ns project.utils)
(defn greet [] (println "Hello, World!"))

但是这会失败:

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

当我尝试运行它时,我的类路径包括顶级的 Clojure/ 目录和两个 jar 包。我还尝试将 project/ 目录放在类路径中,但没有成功。

如何设置一个简单的 Clojure 项目?

2个回答

9

您没有提到您的环境是什么(即Emacs/SLIME/Swank,vim/Vimclojure),因此我假设您正在尝试从命令行调用它。

您需要将 Clojure/ 项目目录添加到类路径中:

java -cp path/to/clojure.jar:path/to/clojure-contrib.jar:path/to/Clojure ...

请确保检查路径是否相对于当前工作目录正确。它需要指向您的命名空间的根目录(即,如果在Clojure/中运行,则路径为.)。
事实上,您的项目布局在我的机器上可以正常工作,但是我使用了use而不是require(但是如果Clojure找到了所有文件,您应该得到不同的错误)。

谢谢。事实证明,我的问题是因为我在project/内运行,所以需要将..添加到类路径中。现在它可以工作了。顺便说一下,我使用的是Vim\VimClojure。 :) - So8res

5
我曾在另一个问题中发布了这个答案,希望能让你了解文件名如何与命名空间名称相关联以使事情正常工作。但是,既然你的问题是“如何设置简单的Clojure项目”,以下是更好的起点:
  1. Go to GitHub and grab Leiningen.

  2. Follow the instructions in the README. You'll end up doing something like

    $ lein new my-project
    $ cd my-project
    # ... edit project.clj ...
    $ lein deps
    
  3. Hack away! You'll need to put your files in the correct places. That will mean putting your source files in the directory tree rooted at my-project/src, with your core namespace most likely residing at my-project/src/my_project/core.clj. But really, I've explained all the details in the answer linked to above, so please read it (and do leave a comment if I missed something). :-)

Leiningen将为您处理基本项目布局并为REPL / swank / nailgun设置类路径(如果您尚未遇到后两者,很快就会了解 - 但这是一个单独的主题,其中swank部分我在此SO答案中已经涵盖了一定程度),因此希望您永远不需要手动处理java -cp ... 的麻烦。(我在最后一个括号里链接的有关swank的答案详细说明了如何从Emacs内设置正确的类路径来设置swank。)

也许对问题的作者有用:http://alexott.net/en/clojure/ClojureLein.html - 介绍如何使用Leiningen。 - Alex Ott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接